Deallocating memory in C++ vector<T>
Deallocating memory in C++ vector<T>
下面是我目前能构建的最好的"最小工作示例"。我想了解以下代码是否会泄露内存。
// Class CTest
class CTest {
vector<int> Elements;
CTest (vector<int>&);
~CTest ();
};
CTest::CTest (vector<int>& Elements_) {
this->Elements = Elements_;
}
CTest::~CTest () {
}
// main
int main (int argc, char *argv[]) {
vector<CTest> V;
for (auto i = 0; i < 10; i++) {
vector<int> U;
for (auto j = i; j < i + 5; j++) U.push_back (j);
V.push_back (*(new CTest (U)));
}
// Do whatever
return 0;
}
我的想法是正确的吗?因为每次调用new
都没有相应的delete
调用,所以这个程序确实会泄漏内存?
是的,存在内存泄漏。push_back
复制了它的参数,因此原始参数将永远丢失(不再有指向它的指针)。
是的,你是对的。此外,您的代码属于"非常努力地出错"类型,因为vector
已经是一个动态容器,您没有理由为元素执行另一个动态分配(只是为了复制它)。
搞砸的方法还有很多。这些都不是C++的特定设计问题,但语言能阻止你做的事情是有限的。更多示例:
int main(int argc, char **argv)
{
new double; // leak
delete static_cast<void*>(&argc); // doesn't belong to you
int a = *static_cast<int const *>(0x42); // not a valid pointer
{ T x; x.~T(); } // call destructor of non-existent object
{ T y; y.~T(); new (static_cast<void*>(&y) T(); }
// impossible to recover from exception in T::T()
}
幸运的是,很明显你在做一些不该做的事情
是的,这是正确的。你不会取消分配新的任务。此外,您不需要在已经动态的容器中进行动态分配。
是的,它正在泄漏,但只是因为你太努力了。
使用此代码填充V
矢量
V.push_back(CTest(U));
会做需要的事情,没有任何泄漏。
一般来说,标准容器将为您管理内存(没有泄漏)。你不必麻烦。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中