可能是重复问题:
为什么你会想要在堆上分配内存而不是栈上?
Test2 *t2 = new Test2();
t2->test();
Test2 t3;
t3.test();
为什么我要创建一个Test2类型的指针对象?为什么不只使用非指针版本的Test2?为什么我要使用指针对象?找到答案在这里:
可能是重复问题:
为什么你会想要在堆上分配内存而不是栈上?
Test2 *t2 = new Test2();
t2->test();
Test2 t3;
t3.test();
为什么我要创建一个Test2类型的指针对象?为什么不只使用非指针版本的Test2?为什么我要使用指针对象?使用动态存储的原因包括(但可能不限于):
当没有区别时,最好使用您的 t3
方法创建对象。除非必须,否则不要使用动态内存。但有时您确实需要使用它(请参见上述原因)。
foo(var);
vs foo(&var);
此外,指针可用于传递或返回可能存在或不存在的对象。例如:T *foo(); // 返回指向对象或NULL的指针
。static Test2 t3;
的对象将超出其创建的范围。但它并没有在堆上创建。 - AnT stands with Russia如果您有一个非常大的对象(例如具有非常大的缓冲区成员的对象),您可能不想在堆栈上分配它,因为堆栈空间是有限的,在这种情况下,您可以使用operator new在堆上进行分配。
主要区别在于它们存在内存中的位置。"非指针版本"存在于栈上,这意味着一旦函数返回,它将无效,而"指针版本"存在于堆上,这意味着它将一直存在,直到有人调用delete
。通常情况下,最好的做法是尽可能将对象放在栈上,只有在需要时才放在堆上。需要将对象放在堆上的一个很好的例子是:
Obj* f()
{
return new Obj();
}
new Obj()
会在堆上创建一个Obj
对象,并返回指向它的指针,然后从函数中返回。
例如,这样是不起作用的。
Obj* f()
{
Obj o1;
return &o1; //BAD!!
}
由于指针值&o1
引用堆栈上的内存,并且在该点上已清除堆栈上的f()函数,因此谁知道会发生什么。绝对不会有好事情发生。