假设我正在创建类Foo的新对象,它将类Bar的对象作为构造函数参数。如果我以这种方式创建了这个对象:
Foo myObj(new Bar());
在这种情况下,新对象会发生什么?我见过与此示例类似的代码(没有为作为参数创建的新对象的名称)。我会在哪里调用delete
来释放Bar对象占用的内存?
答案 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有关:资源获取是初始化