我在一些地方看到了这样构造的对象:
Foo foo;
foo = *(new Foo());
在我看来,这是非常错误的。 new运算符为Foo分配内存,然后取消引用指针并用于将内容复制到原始且已构造的foo对象。分配的内存泄漏,因为指针丢失。
这是邪恶的,永远不应该完成,或者我错过了什么?
答案 0 :(得分:3)
这非常可怕,是的,但是没有保证内存泄漏。
这取决于类型Foo
。
在实践中,永远不会存在不是内存泄漏的类型,但原则上可以定义例如。
struct Foo
{
std::unique_ptr<Foo> p;
void operator=( Foo& o ){ p.reset( &o ); }
};
我添加了可怕的不兼容标准容器void
结果类型,只是为了好的衡量标准。 :)
所以,关于
“分配的内存泄露,指针丢失。这是真的还是我错过了什么?
...你只是错过了直接从这个SO答案中复制上述代码并将其插入公司的Big Application™中的受训者的情况,原因莫名其妙。
注释:
¹MartinMatilla写了in a comment关于这个问题:“我想这种初始化来自Java / C#程序员试图创建新对象,注意到编译器不允许他们这样做,因为foo是一个对象而不是一个指针,并添加*以便编译器很高兴。“,这是另一种可能性。
功能