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

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 ++中的堆栈,静态和堆


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

  • 手动控制对象的生命周期 - 对象将一直存在,直到您明确销毁它为止
  • 当最终数量的对象仅在运行时知道时(如树中的节点数或数组中的元素数),可以根据需要创建任意数量的对象。
  • 对象类型的运行时控件(类似于多态对象的实际类型)。
  • 如果没有区别,最好使用t3方法创建对象。除非必须,否则不要使用动态内存。但有时你真的必须(见上面的原因)。


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

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

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

    这个清单一直在继续。


    一些类似的问题:

    • 为什么你想要在堆而不是堆栈上分配内存?
    • 何时最好使用堆栈而不是堆,反之亦然?
    • 何时使用"new"而何时不使用C ++?
    • 我什么时候应该在C ++中使用new关键字?
    • 在C ++中适当的堆栈和堆使用
    • C ++中的堆栈,静态和堆


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


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


    主要区别在于它存在于记忆中。"非指针版本"存在于堆栈中,这意味着一旦函数返回它将无效,而"指针版本"存在于堆上,这意味着它将存活并且直到有人在其上调用delete。通常,最好的做法是尽可能将对象放在堆栈上,并且只在需要时才在堆上放置。在堆上需要对象的一个??很好的例子就是这样的

    1
    2
    3
    4
    Obj* f()
    {
      return new Obj();
    }

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

    例如,这不起作用

    1
    2
    3
    4
    5
    Obj* f()
    {
      Obj o1;
      return &o1;  //BAD!!
    }

    由于指针值&o1引用堆栈上的内存,并且f()在此时从堆栈中清除,谁知道将发生什么。绝对没有什么好处。


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