可能重复:
Why would you ever want to allocate memory on the heap rather than the stack?
Test2 *t2 = new Test2();
t2->test();
Test2 t3;
t3.test();
为什么我要创建Test2类型的指针对象?为什么不做Test2的非指针版本?我为什么要做指针对象?
在这里找到答案:
答案 0 :(得分:19)
使用动态存储的原因包括(但可能不限于)
如果没有区别,最好使用t3
方法创建对象。除非必须,否则不要使用动态内存。但有时你真的必须(见上面的原因)。
答案 1 :(得分:7)
如果你需要一个对象比它创建的范围更长,那么其中一个解决方案就是在堆上创建它。在这种情况下,您需要一个指针。还有其他原因,这是最常见的原因。
使用指针的另一个原因是“out”参数。当然,你可以使用引用,但许多人更喜欢使用指针,因为它避免了在调用站点修改参数。 foo(var);
vs foo(&var);
此外,指针可用于传递或返回可能存在或不存在的对象。例如:T *foo(); // returns a pointer to an object or NULL if none exists
。
这个清单一直在继续。
答案 2 :(得分:4)
如果你有一个非常大的对象(例如一个非常大的缓冲区作为成员),你可能不希望在堆栈上分配它,因为堆栈空间是有限的,在这种情况下你在运算符new的堆上分配
答案 3 :(得分:4)
一些类似的问题:
答案 4 :(得分:3)
任何类型的动态数据结构(列表,二叉树,堆栈等)都必须使用指向对象的指针。
答案 5 :(得分:2)
主要区别在于它存在于记忆中。 “非指针版本”存在于堆栈中,这意味着一旦函数返回它将无效,而“指针版本”存在于堆上,这意味着它将存活并且直到有人在其上调用delete
。通常,最好的做法是尽可能将对象放在堆栈上,并且只在需要时才在堆上放置。在堆上需要对象的一个很好的例子就是这样的
Obj* f()
{
return new Obj();
}
new Obj()
在堆上创建一个Obj
对象并返回一个指针,然后从该函数返回。
例如,这不起作用
Obj* f()
{
Obj o1;
return &o1; //BAD!!
}
由于指针值&o1
引用堆栈上的内存,并且f()在此时从堆栈中清除,谁知道将发生什么。绝对没有什么好处。
答案 6 :(得分:1)
常见(但不是必需的)实现是在堆栈上分配局部变量。堆栈是有限的,并且可能有一个对象太大而无法在堆栈上分配。