Jam*_*s C 5 c++ heap pointers object
我正在通过阅读教科书来学习C++."对象和指针"部分说,声明指向对象的指针,如下所示:
SomeClass *ptrMyClass;
Run Code Online (Sandbox Code Playgroud)
什么都不做.只有在定义了Class的实例之后才有意义,如下所示:
SomeClass *ptrMyClass;
ptrMyClass = new SomeClass;
Run Code Online (Sandbox Code Playgroud)
或者将这些组合在一起:
SomeClass *ptrMyClass = new SomeClass;
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我们必须使用'new'在堆上创建SomeClass的实例?到目前为止,在本书中,指针始终指向"正常"变量(如int,float ...),这些变量不是通过使用"new"创建的.谢谢.
C++ 中实例化对象的主要方式有两种:栈和堆(或自由存储)。例如:
void func()
{
// On the stack:
Widget blah;
// On the heap:
Widget * foo = new Widget;
delete foo;
}
Run Code Online (Sandbox Code Playgroud)
堆栈对象/变量的优点是它们的分配/访问速度更快,并且更容易使用。然而,堆栈的大小是有限的,并且数据通常仅限于局部范围(全局变量除外,这通常是不可取的)。也就是说,blah上例中的对象一旦func()结束就会自动销毁。你对此无能为力。因此,当原始项超出范围时,任何指向堆栈对象/变量的指针都会变得无效(也称为“悬空”)。
堆(通常)要大得多,因此它可以处理比堆栈多得多的数据。它往往会稍微慢一些,但它的优点是可以让您在运行时重新分配事物。相比之下,堆栈对象/变量(尤其是数组)在编译时是固定的。
此外,在堆上分配对象后,您可以根据需要将其保留在那里,并维护指向它的有效指针。在过去,您必须delete最终调用以避免内存泄漏。在现代 C++ 中,鼓励使用智能指针(例如std::shared_ptr)。
作为补充说明,声明类成员时会变得稍微复杂一些。如果对象在堆栈上实例化,则其任何直接成员(即组合成员)也将在堆栈上。如果对象在堆上实例化,那么它的所有成员都将在堆上。
| 归档时间: |
|
| 查看次数: |
2232 次 |
| 最近记录: |