请您告诉我堆栈上的堆和构造函数上的构造函数差异(不仅在堆上和堆栈上有所不同)以及何时使用?
答案 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
或全局范围内分配实例。这当然取决于您在程序中使用的算法。
另见: