我是c ++编程的新手,并且无法理解以下代码差异:
int n;
cin >> n;
int list[n];
和
int n;
cin >> n;
int *list = new int[n];
以及c ++编译器如何处理这种代码?
编辑:请不要指点。我想知道如何在代码的第一个块中为“list”变量分配内存,因为“n”值是在运行时确定的。
可能重复:Why aren't variable-length arrays part of the C++ standard?
答案 0 :(得分:3)
第一个创建一个本地自动变量。这(通常)存储在函数的堆栈帧中,这是在函数执行开始时分配的临时内存块(来自线程的堆栈),并在函数返回时释放。当对象超出范围时,它将被销毁;也就是说,当程序离开当前代码块时。这通常是您想要创建变量的方式,除非您需要它们比这更长寿。
堆栈上的vector
对象本身是固定大小的。它管理从堆中分配的n
个对象的动态数组,如下所述。当它被破坏时,它会自动销毁该数组,释放它的内存。
第二个从程序的免费商店(也称为堆)创建一个动态对象。在您明确这样做之前,这不会被销毁:
delete list;
直接处理像这样的动态对象的指针是一个非常糟糕的主意;泄漏对象很容易(可能是从函数返回,抛出异常,丢失唯一的指针),或者意外复制指针并尝试删除它两次。
希望您的教程书能够教您如何使用smart pointers安全地管理动态资源,以及RAII的一般原则。如果没有,请扔掉它并获得better one。