Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:作为构造函数调用中的参数创建的动态分配对象会发生什么情况?_C++_Memory Management_New Operator - Fatal编程技术网

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

C++ C++;:作为构造函数调用中的参数创建的动态分配对象会发生什么情况?,c++,memory-management,new-operator,C++,Memory Management,New Operator,假设我正在创建一个Foo类的新对象,它将Bar类的对象作为构造函数参数。如果我以这种方式创建此对象: Foo myObj(new Bar()); 在这种情况下,新对象会发生什么?我见过类似于此示例的代码(没有作为参数创建的新对象的名称)。我将把我的delete调用放在哪里以释放Bar对象占用的内存?它将留在程序中。如果这些松散的结尾太多或重复太频繁,程序将成为内存占用器,因为它永远不会返回它借用的内存 是的,这是危险的松散结束。这就是为什么人们倾向于使用诸如std::unique_ptr之类的

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

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
的构造函数中。