说我有以下内容:
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
由于foo是在堆上分配的,这会导致问题,还是会将临时Foo的内存复制到堆上的foo地址中?
由于
答案 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泄漏。