这是一个糟糕的c ++对象构造吗?

时间:2016-10-05 08:10:08

标签: c++

我在一些地方看到了这样构造的对象:

Foo foo;
foo = *(new Foo());

在我看来,这是非常错误的。 new运算符为Foo分配内存,然后取消引用指针并用于将内容复制到原始且已构造的foo对象。分配的内存泄漏,因为指针丢失。

这是邪恶的,永远不应该完成,或者我错过了什么?

1 个答案:

答案 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是一个对象而不是一个指针,并添加*以便编译器很高兴。“,这是另一种可能性。 功能