C++:push_back(new Object())内存泄漏?

jbu*_*jbu 14 c++ memory memory-leaks new-operator

以下C++代码是内存泄漏吗?

list.push_back(new String("hi"));
Run Code Online (Sandbox Code Playgroud)

据我了解,来自任何std集合/容器的push_back总是复制.因此,如果复制新字符串,没有什么可以删除新的字符串吗?因为push_back之后没有引用它...

我在这里是对还是错?

谢谢.

JBU

编辑:我认为我错了,因为new会返回一个指针......我们总是会有指针能够删除新的String

jal*_*alf 8

是的,但不是你想的原因.

根据list定义和初始化的方式,push_back可能会抛出异常.如果是这样,返回的指针将new丢失,永远不会被释放.

不过,假设push_back成功返回,它存储指针的一个拷贝回来的new,所以我们可以在以后通过调用释放内存delete上复制,所以只要你没有内存泄漏delete正常.


Unc*_*ens 6

不,向量存储指针,副本由指针组成.您可以在以后随时删除该对象.

(如果语句碰巧抛出异常并且你没有正确捕获并处理它,你可能会泄漏.这就是为什么你可以考虑使用智能指针.)

  • "如果语句恰好抛出一个异常并且你没有正确地捕获并处理它" - 在这个语句的情况下,没有办法正确地处理它,真的.如果`push_back`抛出,那么它没有存储指针,并且没有办法释放它,因为这个调用代码也没有指针.我认为理论上你可以用`String :: operator new`做一些事情,但这听起来并不好玩. (3认同)