C++:在构造函数调用中作为参数创建的动态分配对象会发生什么情况?
C++: What happens to a dynamically allocated object created as an argument in a constructor call?
假设我正在创建一个 class Foo 的新对象,它将 class Bar 的对象作为构造函数参数。如果我以这种方式创建这个对象:
Foo myObj(new Bar());
在这种情况下,新对象会发生什么情况?我见过类似于此示例的代码(没有为作为参数创建的新对象命名)。我应该在哪里调用 delete
来释放 Bar 对象占用的内存?
它留在程序中。如果你有太多这些松散的结局,或者如果它重复得太频繁,程序将成为一个内存消耗者,因为它永远不会returns它借用的内存。
是的,这对于零散的目标来说很危险。这就是为什么人们倾向于使用像 std::unique_ptr<Type>
这样的原语来管理自己并在超出范围时自动销毁并且还可以以自然方式转移所有权。
delete myObj;
中的编程经常被遗忘,因此人们设计了解决它的方法。
如果您在构造函数中有手动 new
,请将 delete
放入析构函数中。这个概念和RAII相关:Resource Acquisition Is Initialization
这取决于,如果它像您的示例那样分配,希望您的 Foo
class 正在管理它,否则 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;
};
new Bar()
产生一个指针,该指针成为 Foo(Bar*)
的构造函数参数(或者,如果 Bar
是从 Base
派生的 class,则构造函数可能是 Foo(Base*
).
Foo
的相应构造函数应该处理资源,否则会泄漏。
假设我正在创建一个 class Foo 的新对象,它将 class Bar 的对象作为构造函数参数。如果我以这种方式创建这个对象:
Foo myObj(new Bar());
在这种情况下,新对象会发生什么情况?我见过类似于此示例的代码(没有为作为参数创建的新对象命名)。我应该在哪里调用 delete
来释放 Bar 对象占用的内存?
它留在程序中。如果你有太多这些松散的结局,或者如果它重复得太频繁,程序将成为一个内存消耗者,因为它永远不会returns它借用的内存。
是的,这对于零散的目标来说很危险。这就是为什么人们倾向于使用像 std::unique_ptr<Type>
这样的原语来管理自己并在超出范围时自动销毁并且还可以以自然方式转移所有权。
delete myObj;
中的编程经常被遗忘,因此人们设计了解决它的方法。
如果您在构造函数中有手动 new
,请将 delete
放入析构函数中。这个概念和RAII相关:Resource Acquisition Is Initialization
这取决于,如果它像您的示例那样分配,希望您的 Foo
class 正在管理它,否则 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;
};
new Bar()
产生一个指针,该指针成为 Foo(Bar*)
的构造函数参数(或者,如果 Bar
是从 Base
派生的 class,则构造函数可能是 Foo(Base*
).
Foo
的相应构造函数应该处理资源,否则会泄漏。