gpt4 book ai didi

c++ - C++:从std::list删除指针

转载 作者:行者123 更新时间:2023-12-02 10:27:27 25 4
gpt4 key购买 nike

通过浏览一堆标题,我在一些文件中发现了这些标题:

Objects& objects
typedef ObjectPointers Objects;
typedef std::list<Object*> ObjectPointers;
因此,这告诉我 objects实际上是指向Object的指针的列表。这样对吗?
我遇到了内存泄漏,我认为这是因为 objects没有被释放。我要删除 objects中的指针还是完全删除 objects?我尝试了以下方法,但没有一个起作用:
for(auto&& child : objects) {
delete child;
}
----------------------

delete[] objects

----------------------

objects.~Object()

删除 objects的正确方法是什么?关于 objects实际上是什么,我的思考过程是否正确?
编辑:
经过进一步研究,似乎我需要删除 objects中的指针。这就是我所做的:
if (!objects.empty()) {
Objects::const_iterator it;
for (it = objects.begin(); it != objects.end(); it++) {
if (*it) {
delete *it; //error here
}
}
}
我有一个核心,它不喜欢 delete *it是无效的事实。如果 *it无效,那么循环不会开始吗?即使它存在,我也要在尝试删除 *it之前先检查它是否存在,因此,如果它不存在,它就不会到达那里。

最佳答案

就像提到的某些程序员花花公子一样,objects是对std::list指针的Object的引用。
如果您想销毁列表中的所有元素,可以通过一个简单的循环来完成:

#include <list>
#include <iostream>

class Object {
public:
Object() { std::cout << "Object()\n"; }
~Object() { std::cout << "~Object()"; }
};

typedef std::list<Object*> ObjectPointers;
typedef ObjectPointers Objects;

int main()
{
std::list<Object*> objects_list;

objects_list.push_back(new Object());

for (auto* obj: objects_list) {
delete obj;
}

// Clear the elements from the list to avoid "use after free" issues
objects_list.clear();
}


// This program outputs:
// Object()
// ~Object()
请注意,您代码中的 objects不是 std::list,而是对它的引用。这意味着 objects只是“指向”了 std::list,而不拥有它。您必须确保在销毁 objects后不要使用 std::list以避免问题。
另一个问题是:谁拥有 std::list引用的 object的元素?如果 std::list本身拥有其中包含的元素,则考虑使用 unique_ptr而不是原始指针,甚至直接将 Object值放入列表中,可能会很有用。

关于c++ - C++:从std::list删除指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63697110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com