【问题标题】:C++ Pointer Objects vs. Non Pointer Objects [duplicate]C ++指针对象与非指针对象[重复]
【发布时间】:2011-02-12 11:58:38
【问题描述】:

【问题讨论】:

  • 很多重复,第一个是(来自 Firas Assaad 的回答)stackoverflow.com/questions/1549945/…
  • 我现在意识到了。然而,问这个问题是困难的部分。现在我想我明白了……:D

标签: c++ pointers object


【解决方案1】:

如果您需要一个对象比创建它的作用域更长,那么解决方案之一就是在堆上创建它。在这种情况下,您将需要一个指针。还有其他原因,这是最常见的。

使用指针的另一个原因是“out”参数。当然,您可以使用引用,但许多人更喜欢使用指针,因为它避免了在调用站点修改参数。 foo(var);foo(&var);

此外,指针可用于传递或返回可能存在或不存在的对象。例如:T *foo(); // returns a pointer to an object or NULL if none exists

这个名单还在继续。

【讨论】:

  • 您能列出其他一些原因吗?
  • 不正确。在本地范围内声明为 static Test2 t3; 的对象将比创建它的范围更长久。但它不是在堆上创建的。
  • @AndreT:好点,我会修改我的答案。
【解决方案2】:

主要区别在于它在内存中的位置。 “非指针版本”存在于堆栈上,这意味着一旦函数返回,它将无效,而“指针版本”存在于堆上,这意味着它会一直存在,直到有人调用delete。一般来说,最好的做法是尽可能将对象放在堆栈上,并且仅在需要时才放在堆上。需要堆上的对象的一个​​很好的例子是这样的

Obj* f()
{
  return new Obj();
}

new Obj() 在堆上创建一个Obj 对象并返回一个指向它的指针,然后从函数返回。

例如,这不起作用

Obj* f()
{
  Obj o1;
  return &o1;  //BAD!!
}

由于指针值&o1引用了堆栈上的内存,并且f()在此时从堆栈中清除,谁知道会发生什么。绝对不是什么好东西。

【讨论】:

    【解决方案3】:
    【解决方案4】:

    如果您有一个非常大的对象(例如一个具有非常大的缓冲区作为成员的对象),您可能不想在堆栈上分配它,因为堆栈空间是有限的,在这种情况下,您可以使用 operator new 在堆上分配.

    【讨论】:

    • 谢谢;我是一名 Java 和 C++ 程序员,但我的课程从未超过堆栈/堆...
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      1. 手动控制对象的生命周期 - 对象将一直存在,直到您明确销毁它
      2. 根据需要创建尽可能多的对象,而最终对象的数量仅在运行时才知道(例如树中的节点数或数组中的元素数)。
      3. 对象类型的运行时控制(如多态对象的实际类型)。

      如果没有区别,最好使用t3 方法创建对象。除非必须,否则不要使用动态内存。但有时您确实必须这样做(请参阅上面的原因)。

      【讨论】:

        【解决方案7】:

        任何类型的动态数据结构(列表、二叉树、堆栈等)都必须使用指向对象的指针。

        【讨论】:

          猜你喜欢
          • 2021-06-19
          • 2019-10-11
          • 1970-01-01
          • 2023-02-09
          • 2011-12-21
          • 2013-08-23
          • 2011-02-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多