1

我有一个配对列表。遍历列表并删除第一个和第二个元素是个好主意吗?其中的对象是用new分配的。

list<pair<string,GraphObject*>>* table;
for(i=0; i< length; i++){
    it = table[i].begin();
    while(it != table[i].end()){
        delete (*it).second;
        delete &(*it).first;
    }
}

编辑:字符串没有分配新的,我现在知道我不必删除它。以这种方式删除第二个可以吗?

4

3 回答 3

5

看起来您的实际需要是std::map使用智能指针

std::map<std::string, std::shared_ptr<GraphObject>> table;

要清除表,您只需编写:

table.clear();

如果你必须使用 std::list,仍然使用智能指针,你仍然只需要调用table.clear();来清除整个表。

std::list<std::pair<std::string, std::shared_ptr<GraphObject>>> table;
于 2013-01-08T23:20:46.880 回答
1

string没有分配给它是的new数据成员pair。你的第二个delete是一个错误。

string也许它是用分配的对象的副本new,但如果是这样,那么您可能很久以前就泄露了原始对象。

new对于第一次删除 -当且仅当您不再需要它们时,删除分配给 的对象是个好主意。你没有说你是否仍然需要这些对象(即你是否还有其他指向它们的指针)。但是,使用智能指针来帮助管理内存是一个更好的主意。

于 2013-01-08T23:21:08.310 回答
0

您不能删除该对的第一部分,因为它不是指针;你的代码甚至不应该编译。您可以做的是在完成后删除整个表。

list<pair<string,GraphObject*>>* table;
for(i=0; i< length; i++){
    it = table[i].begin();
    while(it != table[i].end()){
        delete (*it).second;
    }
}
delete table;

至于是否应该删除该GraphObject*对的第二个成员,这将取决于是否有其他指针副本将在其他地方删除。大概没有,所以您的原始代码是正确的。正如另一个答案中指出的那样,使用智能指针会更容易,因此您不必担心。

于 2013-01-08T23:22:14.357 回答