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它们,你必须自己删除它们.
因此,如果您拥有的是字符串向量,而不是指向字符串的指针,那么您的内存泄漏必须由其他内容引起.
调用v.clear()将销毁当前保存在内部的所有对象v,但不会释放内存(假设该向量很快将再次填充).
如果你真的想要释放记忆,那么成语就是
vector<string>().swap(v);
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的(临时)向量并与其交换其内容v.然后销毁临时向量,释放内存.
向量(与所有标准容器一样)拥有其中的对象.
所以它负责摧毁它们.
注意:如果向量包含指针,那么它拥有指针(不是指针所指向的).所以这些都需要删除.但有更简单的方法.
您可以使用智能指针向量.事实上,你应该使用某种形式的智能指针几乎所有东西.如果你使用指针,你可能仍然像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)
| 归档时间: |
|
| 查看次数: |
32317 次 |
| 最近记录: |