2015-12-13 45 views
0

下面是用于说明我的问题的相同的C++代码
我知道其他工作方法,但有兴趣知道下面的代码是否错误?用指针删除列表也是必须清除的对象

Void pupulatelist() 
{ 
    //populating the list with some int pointers,in actual i have some other objects to delete when accessed each time. 
    for(int i =0;i<5;i++) 
    { 
     int *p = new int(i); 
     list.push_back(p); 
    } 
    //want to delete and erase the contents of the above list 
    // if i dont use erase my actual code is crashing. 

    for(std::list<int *>::iterator iter = list.begin(); iter != list.end(); ++iter) 
    { 
     delete(*iter);  
     list.erase(iter--); 
    } 
} 
+1

取消'list.erase'并在循环之后调用'list.clear'。 (另外,请不要使用类型名称作为变量名称。) – molbdnilo

回答

2

所以,很简单离开list.erase出你的for循环并调用list.clear当你全部完成。

如果你想保留for循环,它需要被修复。它应该是这样的:

for (auto iter = list.begin(); iter != list.end();) { 
    delete *iter; 
    iter = list.erase(iter); 
} 

erase返回一个迭代的元素之后即删除,这样你就不需要在循环递增一个。此外,您的原始循环会减少iter以指向未定义行为(UB)的列表开始之前。

+0

嗨,我已经更新了代码,请您检查一下,并告诉我它是否仍然存在问题。如果我没有错,只是删除指针将不会清除对象。所以我删除对象并清除它。 –

+0

@lokeshkondi您在擦除时没有正确处理迭代器;再次检查我的代码。既然你摆脱了一切,你最好不要在循环中擦除,并在循环完成时调用'clear'。 – 1201ProgramAlarm