这会导致记忆问题吗?

Does this cause memory problems?

本文关键字:问题 记忆      更新时间:2023-10-16

假设我有以下内容:

Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);

由于foo是在堆上分配的,这是否会导致问题,或者将临时foo的内存复制到堆上的foo的地址中?

谢谢

*foo = Foo(anotherBar);与对Foo类型对象的常规赋值没有什么不同。*foo返回一个Foo类型的左值,你正在给它赋值。

简短的回答:它不会引起问题,临时将被复制到foo所指向的堆Foo对象。

只要记得在某个时候删除foo,就不会导致内存泄漏。

如果不能确定赋值操作符将做正确的事情,可以考虑在不释放内存的情况下手动删除和重建:

foo->~Foo();
foo = new (foo) Foo(anotherBar);

我当然不会推荐这样做,它既不直观又不优雅,但我认为我把它放在那里只是为了以防有人真的想避免delete和单独的new带来的重新分配和重新分配。

当然,完全避免new以支持资源管理容器是更可取的。

如果Foo在堆上分配任何东西,它将不会被释放,因为第一个实例的析构函数将不会被调用。

两个对象在运行时使用同一个指针被创建。当它指向第二个内存位置时,我们没有办法访问第一个对象是为了将其释放回堆,因此内存泄漏。