C ++:在构造函数调用中作为参数创建的动态分配对象会发生什么?

时间:2015-08-16 23:38:04

标签: c++ memory-management new-operator

假设我正在创建类Foo的新对象,它将类Bar的对象作为构造函数参数。如果我以这种方式创建了这个对象:

Foo myObj(new Bar());

在这种情况下,新对象会发生什么?我见过与此示例类似的代码(没有为作为参数创建的新对象的名称)。我会在哪里调用delete来释放Bar对象占用的内存?

3 个答案:

答案 0 :(得分:5)

这取决于,如果按照您的示例进行分配,希望您的Foo课程正在管理它,否则Bar将被泄露

class Foo
{
public:
    Foo(Bar* bar) : m_bar{bar} {}
    ~Foo() { delete m_bar; }
private:
    Bar* m_bar;
};

或者,如果您有权访问C ++ 11,则可以使用std::unique_ptr

class Foo
{
public:
    Foo(Bar* bar) : m_bar{bar} {}
private:
    std::unique_ptr<Bar> m_bar;
};

答案 1 :(得分:1)

new Bar()产生一个指针,该指针成为Foo(Bar*)的构造函数参数(或者,如果Bar是从Base派生的类,则构造函数可能为Foo(Base* )。

Foo的相应构造函数应该处理资源,否则会泄露。

答案 2 :(得分:0)

它保留在程序中。如果你有太多这些松散的结束或者它经常重复,程序将变成一个内存生长,因为它永远不会返回它借来的内存。

是的,这对于松散的目的来说是危险的。这就是为什么人们倾向于使用像std::unique_ptr<Type>这样的原语来管理自己并在其超出范围时自动销毁,并且还可以以自然的方式转移所有权。

delete myObj;中的编程经常被遗忘,所以人们已经设法绕过它。

如果构造函数中有手动new,请将delete放在析构函数中。这个概念与RAII有关:资源获取是初始化