说我有以下几点:这是否会导致内存问题?
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
既然foo是在堆上分配这是否会引发问题或者会从临时富内存复制到富的堆上的地址?
由于
说我有以下几点:这是否会导致内存问题?
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
既然foo是在堆上分配这是否会引发问题或者会从临时富内存复制到富的堆上的地址?
由于
*foo = Foo(anotherBar);
不大于常规分配到Foo
类型的对象不同。 *foo
返回Foo类型的左值,并且您正在分配给它。
简答题:它不会造成问题,临时会被复制到foo
指向的堆Foo
对象中。
稍后您仍然需要'删除foo'。我们假设'Foo'的赋值操作符正确实现并释放原始对象可能正在管理的任何资源。 – Praetorian
...除非您的赋值操作符泄漏数据... – bitmask
...或者Foo以奇怪的方式覆盖新的运算符或......或......或许应考虑在C++中的其他许多事物 –
只要您记得在某个时候删除foo,那不会导致内存泄漏。
如果你不能肯定的是,赋值操作符会做正确的事情,你可以考虑手动删除和重建不释放内存:
foo->~Foo();
foo = new (foo) Foo(anotherBar);
我肯定不会推荐这款,它的非直觉和不雅,但我想我把它放在那里,以防万一有人真的想避免由delete
和单独的new
带来的重新分配和重新分配。
当然,避免使用new
完全赞成资源管理容器。
使用相同指针在运行时创建2个选项。 当它指向第二个内存位置,因此我们没有办法访问 第一个对象,以释放它回到堆,因此mem泄漏。
这是不正确的。第二个创建的对象是临时的,* not *通过new分配。第一个对象被解除引用,所以赋值不是指针赋值。 **指针指向的地址不会改变** – Flexo
另请参阅:http://stackoverflow.com/questions/222557/cs-placement-new – DuckMaestro