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

怎么解决重复释放

2013-11-20 
如何解决重复释放typedef struct{.....}DevTypetypedef struct Dev{......DevType *pDevTyeDev:pDevTy

如何解决重复释放
typedef struct
{
    .....;
}DevType;

typedef struct Dev
{
   ......;
   DevType *pDevTye;
   Dev
      :pDevType(NULL)
    {
    }
   ~Dev
   {
     if(pDevType == NULL)
     {
      delete pDevType;
      pDevType = NULL;
     }
   }
   
}

list<device*> mylist;
while(...)
{
   DevType *pDevType = new DevType;
   ...;
   while(...)
    {   
device *d = new device;
        ...;
        d->pDevType = pDevType;
        mylist.push_back(d);     
    }
}

list<device*>::iterator it;
for (it = mylist.begin(); it != mylist.end(); ++it)
{
   ...;
}

for (it = mylist.begin(); it != mylist.end(); ++it)
{
    if(*it ! == NULL)
    {
      delete *it;
      *it = NULL;
    }
}

//问题是pDevType是一个指针指向一块内存,链表有开辟几块内存,每次释放链表的时候都会有一个delete pDevType,所以每次都会有一个~Dev,导致内存重复释放。

新人求大神指导...







内存重复释放,C++
[解决办法]
试试智能指针:(你可以忘了释放问题)

typedef std::unique_ptr<device> device_ptr;
typedef std::shared_ptr<DevType> DevTypePtr;
list<device_ptr> mylist;
while(...)
{
   DevTypePtr devtype(new DevType);
   ...;
   while(...)
    {   
    device_ptr d(new device);
        ...;
        d->pDevType = pDevType;  // 此处要求将device类的成员pDevType的类型修改为DevTypePtr。
        mylist.push_back(d);     
    }
}

[解决办法]
根本不是只能指针的问题,根本就是lz逻辑不清。
按“谁new谁delete"的原则,既然你在类外new,那就该在类外delete,类的析构函数就不该去delete。
如果你在类的析构函数里delete,那就要在类内new。

热点排行