首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于STL list中装载引用语义的删除讨论,该怎么处理

2012-02-08 
关于STL list中装载引用语义的删除讨论前提:list中装载的引用语义(对象指针),非值语义,这里不是讨论值语义

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

热点排行