我有一个这样的指针向量:
std::vector<foo*> stuff;
我用 a 初始化每个元素new foo();
:
我的问题是当我重新分配向量的一个元素时会发生什么,比如说
stuff[3] = new foo();
我是否在泄漏内存,我应该delete[]
在此之前打电话吗?这是我应该使用智能指针的情况吗?(迄今为止从未有过)
通常我不会使用 new 但我正在学习 Qt,这就是示例中的做法。Qt 似乎有自己的智能指针。我应该使用其中之一吗?
谢谢。
我有一个这样的指针向量:
std::vector<foo*> stuff;
我用 a 初始化每个元素new foo();
:
我的问题是当我重新分配向量的一个元素时会发生什么,比如说
stuff[3] = new foo();
我是否在泄漏内存,我应该delete[]
在此之前打电话吗?这是我应该使用智能指针的情况吗?(迄今为止从未有过)
通常我不会使用 new 但我正在学习 Qt,这就是示例中的做法。Qt 似乎有自己的智能指针。我应该使用其中之一吗?
谢谢。
是的,除非您遍历向量并调用删除,否则您会在被破坏时泄漏stuff
所有动态分配的未删除和无法访问。foo
通常当您想要使用的指针向量时std::shared_ptr
std::vector<std::shared_ptr<foo>> stuff;
stuff[3] = std::make_shared<foo>();
如果向量很大并且您尝试复制它(然后也许您想将它包装在另一个 shared_ptr 中),这可能是性能瓶颈,但是如果您只访问向量的元素,它消除了有关谁删除的所有问题原始指针方法带来了什么和什么时候。
我的问题是当我重新分配向量的一个元素时会发生什么,比如说
stuff[3] = new foo();
我是不是在泄露内存
是的,你正在泄漏内存。向量不知道谁负责拥有您分配的对象。它无法区分:
stuff[3] = new foo();
和
foo f;
stuff[3] = &f;
因此,它不会为您进行任何清理。
我应该
delete[]
在此之前打电话吗?
不完全的。delete[]
用于销毁动态分配的数组;这就是你用来销毁通过new[]
. 要销毁通过 plain 分配的东西new
,你应该使用 plain delete
。
这是我应该使用智能指针的情况吗?(迄今为止从未有过)
是的。如果您使用过std::shared_ptr<foo>
(或者boost::shared_ptr<foo>
如果您不能使用 C++11),那么该std::shared_ptr
对象将负责为delete
您生成该对象。
我在您的代码中看不到与 Qt 的任何关系。使用 new 分配对象后不调用 delete 时会发生内存泄漏。你应该怎么做才能在该向量上运行一个循环并在每个项目上调用 delete 。
向量制作对象的副本并存储副本。现在在您的示例中,向量的类型为foo*
。因此,当它传递一个指向 的指针时foo
,vector 会复制指针,而不是foo
自身。现在,当您重新分配并执行其他操作时,指针的副本由向量释放,而不是指针指向的内存。假设您有一个键向量,因此该向量会复制一个传递给它的键,并释放该键的副本。但它从不接触钥匙所在的锁。你需要自己处理。在重新分配之前,您可以自己获取值并释放元素。
如果foo
是 QObjects 然后分配给每个父级(将负责删除它们 - 尽管它们也可以手动删除)。在这种情况下,不要使用智能指针,因为这会产生所有权冲突。