如何删除STL指针列表
How to delete a STL list of pointers?
我有一个配对列表。迭代列表并删除第一个和第二个元素是个好主意吗?其中的对象被分配了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;
}
}
编辑:字符串没有分配给new,我现在知道我不必删除它了。这样删除第二个可以吗?
看起来您的实际需求是带有智能指针的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;
string
不是与new
一起分配的,它是pair
的数据成员。您的第二个delete
是一个错误。
也许它是分配了new
的string
对象的副本,但如果是这样,那么您可能早就泄露了原始对象。
对于第一次删除,最好删除用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 table;
至于是否应该删除该对的GraphObject*
第二个成员,这将取决于是否有其他指针副本将在其他地方删除。可能没有,所以您的原始代码是正确的。正如在另一个答案中所指出的,使用智能指针会更容易,因此您不必担心它。
相关文章:
- 删除包含包含动态对象的 STL 容器的智能指针
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- STL 函数和函数类型与函数指针类型
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- 用于 STL 迭代器、指针和 std::nullptr_t 的模板函数
- 通过函数指针对类内的 STL SET 使用自定义比较器
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 指针类型上的 STL 函数对象
- 清除 C++ 中的指针的 STL 列表
- 限制指针访问STL ::向量元素
- 有没有一种 stl 方法来执行指针向量的深度复制
- 析构函数在与 STL 的共享指针中调用两次
- 指向类的指针的 STL 映射的 SWIG 类型图
- C 指针数组使用STL开始和结束
- 使用带有COM接口的STL智能指针
- STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端
- STL:指针关联排序容器:排序谓词模板
- 如何删除STL指针列表