这会导致内存问题吗?

时间:2011-09-14 01:39:26

标签: c++

说我有以下内容:

Foo* foo = new Foo(bar);

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

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

由于

5 个答案:

答案 0 :(得分:10)

*foo = Foo(anotherBar);Foo类型对象的常规分配没有什么不同。 *foo返回一个类型为Foo的左值,您将分配给它。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您无法确定赋值运算符是否正确,您可以考虑手动删除和重构而不释放内存:

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

我肯定不会推荐这个,而且它不直观且不优雅,但我认为我把它放在那里以防万一有人真的想避免delete和另外一个new带来的释放和重新分配{1}}。

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

答案 4 :(得分:-1)

使用相同的指针在运行时创建2个对象。 当它指向第二个内存位置时,我们无法访问 第一个对象是为了将它释放回堆,因此mem泄漏。