当我们在堆栈上的堆和构造函数上使用构造函数时?

时间:2014-07-02 05:34:44

标签: c++

请您告诉我堆栈上的堆和构造函数上的构造函数差异(不仅在堆上和堆栈上有所不同)以及何时使用?

3 个答案:

答案 0 :(得分:0)

他们没有区别。只是使用来自不同地方的记忆。在两种情况下都会调用相同的构造函数方法(只要参数的类型相同)。

您可能会询问何时使用new。您可以使用new从堆中进行分配,并且由于RAII,在分配时,您也可以构建。

class Foo{
    Foo(int n){
        cout << n << endl;
    }
};

在堆上:

Foo *a = new Foo(5);

在堆栈上:

Foo a(5);

这两个都做同样的事情,打印5。

答案 1 :(得分:0)

堆上的构造函数是在堆中创建类时运行的构造函数。当您在堆栈中创建类时,堆栈上的构造函数是构造函数。

这两个都是相同的构造函数。

现在,认真。在...&#34;上没有像&#34;构造函数。类可以保存在堆栈或堆上的内存中,但它仍然只包含一个构造函数,无论你在哪里持有类,它都会运行。

答案 2 :(得分:0)

从对象实例的角度来看,在堆栈上调用它的构造函数和在堆上调用它之间没有区别。

请参阅此问题:When should I use the new keyword in C++?

从程序的角度来看,它却完全不同。在堆栈上,只要创建的范围保持活动状态,对象实例将保持“活动”状态。当保留该范围时,将调用该对象的析构函数。 在堆上,不会自动调用对象析构函数,您必须使用delete关键字间接调用它,或者在通过 placement new 构造对象时显式调用它

因此,在程序的整个持续时间内,在堆栈上分配的对象可以保持活动状态的唯一范围是main范围。请注意,全局对象实例处于特殊情况,因为它们只需在首次使用之前进行分配。

使用new的原因:您的程序在某个范围内创建一个对象实例,但希望保持实例的活动时间长于范围。回想起来,这似乎是显而易见的,但在某些情况下,您无法在main或全局范围内分配实例。这当然取决于您在程序中使用的算法。

另见: