我正在通过阅读教科书来学习 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/