C++ Pointer Objects vs. Non Pointer Objects
Possible Duplicate:
Why would you ever want to allocate memory on the heap rather than the stack?
1 2 3 4 5 | Test2 *t2 = new Test2(); t2->test(); Test2 t3; t3.test(); |
为什么我要创建Test2类型的指针对象? 为什么不做Test2的非指针版本? 我为什么要做指针对象?
在这里找到答案:
- 为什么你想要在堆而不是堆栈上分配内存?
- 何时最好使用堆栈而不是堆,反之亦然?
- 何时使用"new"而何时不使用C ++?
- 我什么时候应该在C ++中使用new关键字?
- 在C ++中适当的堆栈和堆使用
- C ++中的堆栈,静态和堆
使用动态存储的原因包括(但可能不限于)
如果没有区别,最好使用
如果你需要一个对象比它创建的范围更长,那么其中一个解决方案就是在堆上创建它。在这种情况下,您需要一个指针。还有其他原因,这是最常见的。
使用指针的另一个原因是"out"参数。当然,你可以使用引用,但许多人更喜欢使用指针,因为它避免了在调用站点修改参数。
此外,指针可用于传递或返回可能存在或不存在的对象。例如:
这个清单一直在继续。
一些类似的问题:
- 为什么你想要在堆而不是堆栈上分配内存?
- 何时最好使用堆栈而不是堆,反之亦然?
- 何时使用"new"而何时不使用C ++?
- 我什么时候应该在C ++中使用new关键字?
- 在C ++中适当的堆栈和堆使用
- C ++中的堆栈,静态和堆
如果你有一个非常大的对象(例如一个非常大的缓冲区作为成员),你可能不希望在堆栈上分配它,因为堆栈空间是有限的,在这种情况下你使用operator new在堆上分配。
任何类型的动态数据结构(列表,二叉树,堆栈等)都必须使用指向对象的指针。
主要区别在于它存在于记忆中。"非指针版本"存在于堆栈中,这意味着一旦函数返回它将无效,而"指针版本"存在于堆上,这意味着它将存活并且直到有人在其上调用
1 2 3 4 | Obj* f() { return new Obj(); } |
例如,这不起作用
1 2 3 4 5 | Obj* f() { Obj o1; return &o1; //BAD!! } |
由于指针值
常见(但不是必需的)实现是在堆栈上分配局部变量。堆栈是有限的,并且可能有一个对象太大而无法在堆栈上分配。