创建有关联指针的对象时,为什么要使用 'new'?

32 浏览
0 Comments

创建有关联指针的对象时,为什么要使用 'new'?

我正在通过阅读一本教科书学习C++。 \"对象和指针\" 部分说,声明一个对象指针像这样:

SomeClass *ptrMyClass;

本身并没有什么用。只有在定义类的实例后才有意义,像这样:

SomeClass *ptrMyClass;
ptrMyClass = new SomeClass;

或者将它们结合在一起:

SomeClass *ptrMyClass = new SomeClass;

我的问题是,为什么我们必须使用 \'new\' 在堆上创建 SomeClass 的实例?到目前为止,在书中,指针总是指向没有使用 \'new\' 创建的“正常”变量(如 int、float ...)。谢谢。

admin 更改状态以发布 2023年5月21日
0
0 Comments

我的问题是,为什么我们必须通过使用“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

0
0 Comments

在C++中,实例化对象有两种主要方法:栈和堆(或自由存储)。例如:

void func()
{
    // On the stack:
    Widget blah;
    // On the heap:
    Widget * foo = new Widget;
    delete foo;
}

栈对象/变量的优点是它们倾向于更快地分配/访问,并且它们稍微更容易使用。然而,栈是有限大小的,数据通常仅限于本地范围(除了全局变量,通常不建议使用)。也就是说,在上面的示例中,blah对象将在 func()结束时自动销毁。您无法对此做任何事情。因此,任何指向堆栈对象/变量的指针在原始项超出范围时变得无效(也称为“悬空”)。

堆(通常)大得多,因此它可以处理比堆栈多得多的数据。它倾向于略微慢一些,但它的优点是让您能够在运行时重新分配事物。相比之下,堆栈对象/变量(尤其是数组)在编译时固定。

此外,一旦在堆上分配了对象,则可以将其留在那里,直到您需要它,并保持有效的指针。过去,您必须调用delete最终避免内存泄漏。在现代C++中,鼓励使用智能指针(例如std::shared_ptr)。

作为附加说明,当声明类的成员时,情况会稍微复杂一些。如果在堆栈上实例化对象,则任何其直接成员(即由组成成员)将也在堆栈上。如果在堆上实例化对象,则所有成员都将在堆上。

0