分配字符串时,char * new和delete []错误

时间:2012-04-26 06:15:53

标签: c++ memory runtime-error new-operator delete-operator

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

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

3 个答案:

答案 0 :(得分:9)

pear = new char[1024];

1024个字符的内存从堆分配,pear分配到它的开头。

pear = "happy go lucky";

pear现在指向驻留在只读段中的字符串文字,并且先前分配的内存已泄露。

delete [] pear;

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

答案 1 :(得分:5)

  

pear =“happy go lucky”;

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

那很糟糕。您只能delete使用new分配的内容。而且由于你覆盖(并丢失)了那个指针,你不能delete它。

答案 2 :(得分:2)

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