C++ C++;指针对象与非指针对象
可能重复:C++ C++;指针对象与非指针对象,c++,pointers,object,C++,Pointers,Object,可能重复: 为什么要创建Test2类型的指针对象?为什么不直接做非指针版本的Test2呢?为什么我要做指针对象 在这里找到答案: 如果您需要一个对象在其创建的范围之外生存,那么解决方案之一就是在堆上创建它。在这种情况下,您需要一个指针。还有其他原因,这是最常见的 使用指针的另一个原因是用于“out”参数。当然,您可以使用引用,但许多人更喜欢使用指针,因为它避免了在调用站点修改参数foo(var)vsfoo(&var) 此外,指针可用于传递或返回可能存在或不存在的对象。例如:T*f
为什么要创建Test2类型的指针对象?为什么不直接做非指针版本的Test2呢?为什么我要做指针对象 在这里找到答案:
foo(&var)代码>
此外,指针可用于传递或返回可能存在或不存在的对象。例如:T*foo();//返回指向对象的指针,如果不存在,则返回NULL
这个列表真的是层出不穷。任何类型的动态数据结构(列表、二叉树、堆栈等)都必须使用指向对象的指针。使用动态存储的原因包括(但可能不限于)
手动控制对象的生命周期-对象将一直存在,直到您明确销毁它
如果只在运行时知道对象的最终数量(如树中的节点数或数组中的元素数),则根据需要创建尽可能多的对象
对象类型的运行时控件(如多态对象的实际类型)
如果没有区别,最好使用t3
方法创建对象。除非必须,否则不要使用动态内存。但是有时候你真的必须这样做(参见上面的原因)。一个常见的(但不是必需的)实现是在堆栈上分配局部变量。堆栈是有限的,可能有一个对象太大而无法在堆栈上分配。如果您有一个非常大的对象(例如一个具有非常大的缓冲区作为成员的对象),您可能不想在堆栈上分配它,因为堆栈空间有限,在这种情况下,您可以使用运算符new在堆上进行分配。为您提供一些类似的问题:
主要区别在于它在内存中的位置。“非指针版本”位于堆栈上,这意味着一旦函数返回,它将无效,而“指针版本”位于堆上,这意味着它将一直处于活动状态,直到有人对其调用delete
。通常认为最好的做法是尽可能将对象放在堆栈上,并且仅在需要时才放在堆上。需要堆上的对象的一个很好的例子如下
Obj* f()
{
return new Obj();
}
newobj()
在堆上创建一个Obj
对象,并返回指向该对象的指针,然后从函数返回该指针
例如,这是行不通的
Obj* f()
{
Obj o1;
return &o1; //BAD!!
}
由于指针值&o1
引用堆栈上的内存,而此时f()从堆栈中清除,谁知道会发生什么。肯定没什么好的。你能列举一些其他原因吗?不正确。对象声明为statictest2t3本地作用域中的代码>将比创建它的作用域更有效。“但它不是在堆上创建的”。@安德烈:好的,我将修改我的答案。谢谢;我是java和C++程序员,但是我的类从来没有过堆栈/堆…你应该把这个作为注释添加到问题中,然后投票结束。很多重复,首先是(从Firas Assaad回答)我现在意识到了。然而,问这个问题是困难的。现在我想我明白了D
Obj* f()
{
Obj o1;
return &o1; //BAD!!
}