读书人

关于STL list中装载引用语义的删除讨论

发布时间: 2012-02-08 19:52:21 作者: rapoo

关于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库的指针容器

读书人网 >C++

热点推荐