C++ C++;:作为构造函数调用中的参数创建的动态分配对象会发生什么情况?
假设我正在创建一个Foo类的新对象,它将Bar类的对象作为构造函数参数。如果我以这种方式创建此对象:C++ C++;:作为构造函数调用中的参数创建的动态分配对象会发生什么情况?,c++,memory-management,new-operator,C++,Memory Management,New Operator,假设我正在创建一个Foo类的新对象,它将Bar类的对象作为构造函数参数。如果我以这种方式创建此对象: Foo myObj(new Bar()); 在这种情况下,新对象会发生什么?我见过类似于此示例的代码(没有作为参数创建的新对象的名称)。我将把我的delete调用放在哪里以释放Bar对象占用的内存?它将留在程序中。如果这些松散的结尾太多或重复太频繁,程序将成为内存占用器,因为它永远不会返回它借用的内存 是的,这是危险的松散结束。这就是为什么人们倾向于使用诸如std::unique_ptr之类的
Foo myObj(new Bar());
在这种情况下,新对象会发生什么?我见过类似于此示例的代码(没有作为参数创建的新对象的名称)。我将把我的
delete
调用放在哪里以释放Bar对象占用的内存?它将留在程序中。如果这些松散的结尾太多或重复太频繁,程序将成为内存占用器,因为它永远不会返回它借用的内存
是的,这是危险的松散结束。这就是为什么人们倾向于使用诸如std::unique_ptr
之类的原语,这些原语可以管理自己并在超出范围时自动销毁,还可以以自然方式转移所有权
编程中删除myObj代码>经常被遗忘,因此人们已经想出了绕过它的方法
如果构造函数中有手动new
,请将delete
放入析构函数中。这个概念与RAII相关:资源获取是初始化这取决于,如果它像您的示例中那样分配,希望您的Foo
类正在管理它,否则条
将泄漏
class Foo
{
public:
Foo(Bar* bar) : m_bar{bar} {}
~Foo() { delete m_bar; }
private:
Bar* m_bar;
};
或者,如果您可以访问C++11,您可以使用std::unique\u ptr
class Foo
{
public:
Foo(Bar* bar) : m_bar{bar} {}
private:
std::unique_ptr<Bar> m_bar;
};
class-Foo
{
公众:
Foo(Bar*Bar):m_Bar{Bar}{}
私人:
std::唯一的ptr m_条;
};
newbar()
生成一个指针,该指针将成为Foo(Bar*)
(或者,如果Bar
是从Base
派生的类,则构造函数可能是Foo(Base*
)
Foo
的相应构造函数应该处理资源,否则它会泄漏。在我看来,您不应该编写这样的代码。要么您拥有原始指针(这是不好的),要么您有内存泄漏(更糟的)。如果您希望Foo
拥有指向Bar
的指针,则希望传递unique\u ptr
。在我看来,最好将unique\u ptr
传递到Foo
的构造函数中。