创建有关联指针的对象时,为什么要使用 'new'?
创建有关联指针的对象时,为什么要使用 'new'?
我正在通过阅读一本教科书学习C++。 \"对象和指针\" 部分说,声明一个对象指针像这样:
SomeClass *ptrMyClass;
本身并没有什么用。只有在定义类的实例后才有意义,像这样:
SomeClass *ptrMyClass; ptrMyClass = new SomeClass;
或者将它们结合在一起:
SomeClass *ptrMyClass = new SomeClass;
我的问题是,为什么我们必须使用 \'new\' 在堆上创建 SomeClass 的实例?到目前为止,在书中,指针总是指向没有使用 \'new\' 创建的“正常”变量(如 int、float ...)。谢谢。
admin 更改状态以发布 2023年5月21日
我的问题是,为什么我们必须通过使用“new”在堆上创建 SomeClass 的实例?
你不必这样做。你可以使用 new 动态创建一个对象。或者你可以得到一个指向现有对象的指针。
SomeClass* ptrMyClass1; // An uninitialized pointer. // If an automatic object its value is indeterminate and // You have not defined what it points at. It should not // be used (until you explicitly set it to something). // If a static object then it is initialized to NULL // i.e. Global (or other static storage duration object). SomeClass* ptrMyClass2 = new SomeClass; // A pointer to a dynamically // allocated object. SomeClass objMyClass3; // A normal object SomeClass* ptrMyClass4 = &objMyClass3; // A pointer to a normal object
在C++中,实例化对象有两种主要方法:栈和堆(或自由存储)。例如:
void func() { // On the stack: Widget blah; // On the heap: Widget * foo = new Widget; delete foo; }
栈对象/变量的优点是它们倾向于更快地分配/访问,并且它们稍微更容易使用。然而,栈是有限大小的,数据通常仅限于本地范围(除了全局变量,通常不建议使用)。也就是说,在上面的示例中,blah
对象将在 func()
结束时自动销毁。您无法对此做任何事情。因此,任何指向堆栈对象/变量的指针在原始项超出范围时变得无效(也称为“悬空”)。
堆(通常)大得多,因此它可以处理比堆栈多得多的数据。它倾向于略微慢一些,但它的优点是让您能够在运行时重新分配事物。相比之下,堆栈对象/变量(尤其是数组)在编译时固定。
此外,一旦在堆上分配了对象,则可以将其留在那里,直到您需要它,并保持有效的指针。过去,您必须调用delete
最终避免内存泄漏。在现代C++中,鼓励使用智能指针(例如std::shared_ptr
)。
作为附加说明,当声明类的成员时,情况会稍微复杂一些。如果在堆栈上实例化对象,则任何其直接成员(即由组成成员)将也在堆栈上。如果在堆上实例化对象,则所有成员都将在堆上。