我应该删除vector <string>吗?

Iam*_*per 19 c++ memory-management

在过去的几天里,我痛苦地学习了很多关于c ++编程的知识.
我喜欢它:)
我知道我应该释放记忆 - 现在我的世界中存在金色的"每个malloc = free"或"每个new = delete"规则,但我将它们用于相当简单的对象.
矢量怎么样?无论我在哪里,我都在使用vector.clear(),但这显然是不够的,因为我有巨大的内存泄漏.
你能指导我如何对待这件事吗?

*编辑
谢谢,你的评论让我想到了这个应用程序的算法,我将能够完全消除向量.:哦
对不起 - 我开始在这里解释我的用例,我发现了我真正需要的东西.就像每天18小时编码最后3天一样:|*编辑2
这很疯狂.通过代码的微小变化,我将内存使用量从2x130 mb(不断增长)消除到2x 13,5mb,恒定大小.谢谢你让我以另一种方式思考这个问题.

顺便说一句.这样的自我代码审查有一个名字 - 有人记得吗?当你问任何人(甚至你的母亲或狗)并开始解释你的问题时 - 突然你自己解决了这个5小时的问题,只是试图从其他角度来看待它,或者只是试图总结它是什么所有关于.我经常发现自己被抓住了......

Dim*_*ima 24

规则是当您清除对象向量时,将调用每个元素的析构函数.另一方面,如果你有一个指针向量,vector::clear()不会调用delete它们,你必须自己删除它们.

因此,如果您拥有的是字符串向量,而不是指向字符串的指针,那么您的内存泄漏必须由其他内容引起.

  • 是.当一个对象被销毁时,会调用其所有数据成员的析构函数.但正如我所说,请注意你在矢量中存储的内容.如果它是对象的向量,则对象将与向量一起被销毁.如果它是指针的向量,那么你必须自己删除它们. (4认同)

rlb*_*ond 9

你不需要这样做.std :: string清理自己,所以字符串不是你的问题.请记住,你没有使用,new所以你不必使用delete.

您应该了解RAII - 它使分配和释放更加简单.你会以这种方式避免内存泄漏.


ava*_*kar 7

调用v.clear()将销毁当前保存在内部的所有对象v,但不会释放内存(假设该向量很快将再次填充).

如果你真的想要释放记忆,那么成语就是

vector<string>().swap(v);
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的(临时)向量并与其交换其内容v.然后销毁临时向量,释放内存.

  • 它可能看起来很尴尬,但它是减少`v.capacity()`的惯用方法.你的代码片段不会编译,因为`vector <string>()`是一个rvalue,不能绑定到非const引用. (2认同)

Mar*_*ork 5

向量(与所有标准容器一样)拥有其中的对象.
所以它负责摧毁它们.

注意:如果向量包含指针,那么它拥有指针(不是指针所指向的).所以这些都需要删除.但有更简单的方法.

您可以使用智能指针向量.事实上,你应该使用某种形式的智能指针几乎所有东西.如果你使用指针,你可能仍然像C程序员一样编程.

所以:

std::vector<int>    data; // clear is fine.

std::vector<int*>   data1; // Now things need to be deleted.
// alternative 1:
std::vector<boost::shared_ptr<int> >  data2; // The shared pointer will auto
                                             // delete the pointer.
// alternative 2:
boost::ptr_vector<int>  data3;               // Here the container knows that
                                             // it is holding pointers and will
                                             // auto de-reference them when you
                                             // its members.
Run Code Online (Sandbox Code Playgroud)

但听起来你需要开始考虑学习智能指针.

int*  x = new int(5);
// Do stuff.
*x = 8;
delete x;

// --- Instead use a smart pointer:
std::auto_ptr<int>  x(new int(5));
// Do stuff.
*x = 8;
// No delete (the auto ptr handles it.
Run Code Online (Sandbox Code Playgroud)


ASk*_*ASk 5

从STL容器中删除元素可以保证在这些元素上调用析构函数.但是,如果你有一个某种pointer-to-T类型的容器,那么你仍然必须自己释放指向内存(在这种情况下,指针的"析构函数"被调用,这是一个无操作).

如果您不想在这种情况下手动管理内存,请考虑使用智能指针解决方案指针容器.