C ++指针对象与非指针对象[重复]

Posted

技术标签:

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

可能重复: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的非指针版本?我为什么要做指针对象?

在这里找到答案:

Why would you ever want to allocate memory on the heap rather than the stack? When is it best to use a stack instead of a heap and vice versa? When to use "new" and when not to in C++? When should I use the new keyword in C++? Proper stack and heap usage in C++ Stack, Static and Heap in C++

【问题讨论】:

很多重复,第一个是(来自 Firas Assaad 的回答)***.com/questions/1549945/… 我现在意识到了。然而,问这个问题是困难的部分。现在我想我明白了……:D 【参考方案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】:

给你一些类似的问题:

Why would you ever want to allocate memory on the heap rather than the stack? When is it best to use a stack instead of a heap and vice versa? When to use "new" and when not to in C++? When should I use the new keyword in C++? Proper stack and heap usage in C++ Stack, Static and Heap in C++

【讨论】:

您应该在问题中将其添加为 cmets 并投票结束。【参考方案4】:

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

【讨论】:

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

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于C ++指针对象与非指针对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

循环中的C ++对象引用[重复]

为啥C ++允许将指向基对象的指针转换为派生类的指针[重复]

指向从未被设为 const 的 const 对象的 C++ 指针 [重复]

没有 new 关键字并使用指针的 C++ 对象初始化 [重复]

C++C++自学旅程:对象数组和对象指针

为啥派生类对象的指针数组无法声明