C ++指针对象与非指针对象

时间:2010-04-26 16:44:17

标签: c++ pointers object

7 个答案:

答案 0 :(得分:19)

使用动态存储的原因包括(但可能不限于)

  1. 手动控制对象的生命周期 - 对象将一直存在,直到您明确销毁它
  2. 根据需要创建尽可能多的对象,当最终的对象数仅在运行时知道时(如树中的节点数或数组中的元素数)。
  3. 对象类型的运行时控件(类似于多态对象的实际类型)。
  4. 如果没有区别,最好使用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)

常见(但不是必需的)实现是在堆栈上分配局部变量。堆栈是有限的,并且可能有一个对象太大而无法在堆栈上分配。