【发布时间】:2017-05-02 05:34:06
【问题描述】:
当我意识到我对指针有很大的误解时,我正在解决一些编程练习。请有人解释一下这段代码导致 C++ 崩溃的原因。
#include <iostream>
int main()
{
int* someInts = new int[5];
someInts[0] = 1;
someInts[1] = 1;
std::cout << *someInts;
someInts++; //This line causes program to crash
delete[] someInts;
return 0;
}
P.S 我知道这里没有理由使用“新”,我只是让示例尽可能小。
【问题讨论】:
-
你能解释一下为什么你认为这段代码应该工作,你希望它产生什么?也许你认为只删除部分分配的内存是可能的?或者,调用 delete 运算符可能会与指向分配对象内部的任何指针一起工作(无论确切在哪里)?或许还有别的,请详细说明。
-
到目前为止,每个人都在解释正确但有点不透明的内存语义。不幸的是,因为这显然是一个初学者问题,而 OP 几乎可以肯定 意味着
(*someInts)++;. -
为什么不会崩溃?
-
@imallett 我认为你可能是对的。但是,我当然没有那样解释问题! OP 对程序试图做什么的一些解释会很好......
-
@philipxy 实际上,他们的代码是正确的 MCVE 并演示了确切的问题,而带有注释的行 is 是直接导致崩溃的那个。 (但是,正如您所指出的,它崩溃的不是 where 行。)
delete[]需要一个从相应数组new获得的指针。递增从数组new获得的指针,然后将结果指针传递给delete[],是无效的并导致UB。正如他们正确指出的那样,someInts++;是问题所在。
标签: c++ pointers dynamic-memory-allocation delete-operator