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 ++允许将指向基对象的指针转换为派生类的指针[重复]
指向从未被设为 const 的 const 对象的 C++ 指针 [重复]