在C++中释放指针的std :: vector的正确方法是什么?

bod*_*ydo 16 c++ memory containers vector delete-operator

我搜索了StackOverflow但找不到这个问题的答案.

假设我有一个std::vector<Day *> vector_day- 即指向Day对象的指针向量.现在我push_backvector_day很多元素:

vector_day.push_back(new Day(12));
vector_day.push_back(new Day(99));
vector_day.push_back(new Day(71));
...
Run Code Online (Sandbox Code Playgroud)

现在在某些时候我不再需要了vector_day.什么是释放记忆的正确方法?

这是正确的方法:

for (std::vector<Day *>::iterator i = vector_day.begin(); i != vector_day.end(); ++i) {
    delete *i;
}
Run Code Online (Sandbox Code Playgroud)

这不会使每次删除时的向量无效吗?我很迷茫.

Tyl*_*nry 18

如果您不是绝对需要,最好的方法是不要将指针放在向量中.

但是如果你确实需要有一个指针向量,那么你做它的方式就好了(但是.clear()后面的矢量,如果它不会被立即销毁,那么它就不会充满悬空指针)

该声明

delete *it;
Run Code Online (Sandbox Code Playgroud)

对迭代器没有影响.它不会更改迭代器,使迭代器无效,也不会从集合中删除迭代器引用的指针.所有这一切都是释放迭代器引用的指针所指向的内存.指针本身必须单独从集合中删除.


Edi*_*enz 7

提升ptr_vector救援!

完全符合您的需要,无需迭代和删除std :: vector的内容


Did*_*set 5

另一种 C++ 方法是定义一个辅助结构:

struct delete_ptr { // Helper function to ease cleanup of container
    template <typename P>
    void operator () (P p) {
        delete p;
    }
};
Run Code Online (Sandbox Code Playgroud)

然后使用算法:

std::for_each(vector_day.begin(), vector_day.end(), delete_ptr());
vector_day.clear();
Run Code Online (Sandbox Code Playgroud)