7

我需要一个 C++ 复习。为什么这会产生内存异常?

pear = new char[1024];
pear = "happy go lucky";
delete [] pear; // exception
4

3 回答 3

9
pear = new char[1024];

1024 个字符的内存从堆中分配并pear指向它的开头。

pear = "happy go lucky";

pear现在指向位于只读段中的字符串文字,并且先前分配的内存被泄漏。

delete [] pear;

您尝试释放只读字符串,这是一种未定义的行为,表现为运行时异常。

于 2012-04-26T06:18:37.527 回答
5

pear = "祝你好运";

将替换由 分配的指针new char[]。所以现在你delete[] pear尝试释放静态分配的字符串。

那很糟。你只能用delete你分配的东西new。而且由于您覆盖(并丢失)了该指针,因此您不能delete这样做。

于 2012-04-26T06:18:23.700 回答
2

您正在做的是分配pear给堆上分配的字符数组,然后重新分配它以指向位于静态位置的字符串。如果您尝试删除它将出错,因为您不应该删除该静态位置中的内容。

于 2012-04-26T06:19:55.927 回答