c++ - 为什么在创建具有关联指针的对象时使用 'new'?

标签 c++ object pointers heap-memory

我正在通过阅读教科书来学习 C++。 “对象和指针”部分说,声明一个指向这样的对象的指针:

SomeClass *ptrMyClass;

本身什么都不做。只有在定义了 Class 的实例之后它才有意义,就像这样:

SomeClass *ptrMyClass;
ptrMyClass = new SomeClass;

或者将它们组合在一起:

SomeClass *ptrMyClass = new SomeClass;

我的问题是,为什么我们必须使用 'new' 在堆上创建 SomeClass 的实例?到目前为止,在本书中,指针始终指向不是使用“new”创建的“普通”变量(如 int、float...)。谢谢。

最佳答案

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

void func()
{
    // On the stack:
    Widget blah;

    // On the heap:
    Widget * foo = new Widget;
    delete foo;
}

堆栈对象/变量的优势在于它们的分配/访问速度往往更快一些,并且使用起来也更容易一些。然而,堆栈的大小是有限的,数据通常仅限于局部范围(全局变量除外,通常不建议这样做)。也就是说,上面例子中的blah对象会在func()结束的时候自动销毁。你对此无能为力。因此,当原始项目超出范围时,任何指向堆栈对象/变量的指针都会变得无效(也称为“悬空”)。

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

此外,在堆上分配一个对象后,您可以根据需要将它留在那里,维护指向它的有效指针。过去,您最终必须调用 delete 以避免内存泄漏。在现代 C++ 中,鼓励使用智能指针(例如 std::shared_ptr)。

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

关于c++ - 为什么在创建具有关联指针的对象时使用 'new'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616576/

相关文章:

c++ - 我如何从 cpp 中的任何给定数字的右边获得第三位数字?

javascript - 这是用于制作将各种方法封装到不同对象中的命名空间的正确 javascript 吗?

java - 为什么final可以在构造函数中初始化?

c++ - 当它不在 cpu 寄存器中时,是否可以将具有两个高阶零字节的指针存储为 WORD?

c - 这个十六进制算术是如何工作的?

c++ - 如何在 C++11 中初始化 std::vector<std::string> 的静态 constexpr 成员?

c++ - 对 `__imp_WSACleanup' 的 undefined reference

c++ - 字符串在预处理器中连接到自身

vb.net - 这个属性应该是我的对象接口(interface)的一部分吗?

pointers - 附加到作为 map 中值的 slice