2011-09-14 106 views
3

说我有以下几点:这是否会导致内存问题?

Foo* foo = new Foo(bar); 

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

既然foo是在堆上分配这是否会引发问题或者会从临时富内存复制到富的堆上的地址?

由于

+0

另请参阅:http://stackoverflow.com/questions/222557/cs-placement-new – DuckMaestro

回答

10

*foo = Foo(anotherBar);不大于常规分配到Foo类型的对象不同。 *foo返回Foo类型的左值,并且您正在分配给它。

简答题:它不会造成问题,临时会被复制到foo指向的堆Foo对象中。

+9

稍后您仍然需要'删除foo'。我们假设'Foo'的赋值操作符正确实现并释放原始对象可能正在管理的任何资源。 – Praetorian

+0

...除非您的赋值操作符泄漏数据... – bitmask

+0

...或者Foo以奇怪的方式覆盖新的运算符或......或......或许应考虑在C++中的其他许多事物 –

1

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

+0

您的意思是析构函数而不是构造函数?如果它有一个析构函数,[C++ rule of three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three/4172961#4172961)表明它也应该有一个赋值运算符也正因为如此。 – Flexo

+0

bluh?是的,这就是我的意思! – mkb

1

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

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

我肯定不会推荐这款,它的非直觉和不雅,但我想我把它放在那里,以防万一有人真的想避免由delete和单独的new带来的重新分配和重新分配。

当然,避免使用new完全赞成资源管理容器。

-1

使用相同指针在运行时创建2个选项。 当它指向第二个内存位置,因此我们没有办法访问 第一个对象,以释放它回到堆,因此mem泄漏。

+0

这是不正确的。第二个创建的对象是临时的,* not *通过new分配。第一个对象被解除引用,所以赋值不是指针赋值。 **指针指向的地址不会改变** – Flexo

相关问题