关于STL list中装载引用语义的删除讨论
前提:list中装载的引用语义(对象指针),非值语义,这里不是讨论值语义与引用语义。
请高手指点,下面的代码有没有内存问题。代码在BCB6.0中编译通过。
//---------------------------------------
#pragma hdrstop
//---------------------------------------
#include <list.h>
#include <iostream.h>
#include <algorithm.h>
#pragma argsused
const MAX_BUFFER_1 = 256;
const MAX_BUFFER_2 = 65536;
class _Parameter
{
private:
char *_name;
public:
char* __fastcall name(void) { return _name; }
__fastcall _Parameter(char* value)
{
_name = NULL;
_name = new char[strlen(value) + 1];
strcpy(_name, value);
}
__fastcall ~_Parameter()
{
std::cout < < "销毁对象: " < < _name < < std::endl;
//释放对象资料
if (_name != NULL)
delete[] _name;
}
};
template <class t> //查找函数
class findvalue
{
private:
char *_name;
public:
findvalue(char *name) : _name(name) { }
bool operator()(const t* ptr) const
{
if (strcmp(ptr-> name(), _name) == 0)
return true;
else
return false;
}
};
template <class t> //查找符合条件的容器项,并删除该项中的内容--对象指针。
class removevalue
{
private:
char *_name;
public:
removevalue(char *name) : _name(name) { }
bool operator()(const t* ptr) const
{
if (strcmp(ptr-> name(), _name) == 0)
{
delete ptr; //在此外删除对象,可行吗?
return true;
}
else
return false;
}
};
template <class t> //删除所有的指针操作。
struct deletevalue
{
void operator()(t* ptr) { delete ptr; }
};
int main(int argc, char* argv[])
{
list <_Parameter*> ::iterator iparam;
list <_Parameter*> factory;
char name[50];
_Parameter* parameter;
memset(name, '\0 ', 50);
strcpy(name, "China ");
parameter = new _Parameter(name);
factory.push_back(parameter);
memset(name, '\0 ', 50);
strcpy(name, "British ");
parameter = new _Parameter(name);
factory.push_back(parameter);
memset(name, '\0 ', 50);
strcpy(name, "America ");
parameter = new _Parameter(name);
factory.push_back(parameter);
//查找对象。
iparam = find_if(factory.begin(),
factory.end(),
findvalue <_Parameter> ( "British "));
if (iparam != factory.end())
{
cout < < "找到对象: " < <
(static_cast <_Parameter*> (*iparam))-> name() < < endl;
cout < < "对象地址: " < <
reinterpret_cast <int> (*iparam) < < endl;
}
//删除对象。
iparam = remove_if(factory.begin(),
factory.end(),
removevalue <_Parameter> ( "British "));
factory.erase(iparam);
iparam = find_if(factory.begin(),
factory.end(),
findvalue <_Parameter> ( "British "));
if (iparam == factory.end())
{
cout < < endl < < "British对象已经被删除 " < < endl < < endl;
}
//删除所有对象。
for_each(factory.begin(),
factory.end(),
deletevalue <_Parameter> ());
factory.clear();
return 0;
}
//---------------------------------------
[解决办法]
list可以输出元素的操作太多了,基本上你防不全的。
所以不要放指针,放boost::shared_ptr,或者直接使用boost库的指针容器