代码:
int *ptr = new int[10];
int *q = ptr;
delete q;运行正常,没有任何问题(没有运行时错误)。
但是,以下代码:
int *ptr = new int[10];
int *q = ptr;
q++;
delete q;导致运行时错误。
我使用Microsoft Visual Studio-8和Win-7作为平台。
我不能弄清楚为什么在第二种情况下会出现运行时错误?
发布于 2011-08-01 01:04:52
您的代码正在导致未定义的行为。未定义的行为意味着任何事情都可能发生,该行为无法定义。这个程序完全是靠运气运行的,它的行为无法解释。
基本上,
如果使用new分配动态内存,那么必须使用 delete来释放它。
如果使用new[]分配动态内存,那么必须使用 delete[]来释放它。
将new未返回的任何地址传递给delete是一种未定义的行为。
以下是《标准报》的引文。
根据C++03标准§3.7.4.2-3:
如果释放函数通过抛出异常而终止,则行为未定义。提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果释放函数是在标准库中提供的函数,则调用无效。否则,提供给标准库中的运算符
delete(void*)的值应为先前调用标准库中的运算符new(std::size_t)或operator new(std::size_t, const std::nothrow_-t&)返回的值之一,提供给标准库中的运算符delete[](void*)的值应为先前调用标准库中的operator new[](std::size_t)或operator new[](std::size_t, const std::nothrow_t&)返回的值之一。
在C++中,最好通过使用智能指针来使用,而不是使用原始指针,它会自动处理内存释放。
发布于 2011-08-01 01:00:06
这里有两个错误:
不能使用new.
delete delete new[]返回的指针-您需要使用delete[].因此,第一个代码片段只是巧合地工作,并且没有错误,因为您使用的是原语类型。如果是UDT,析构函数就不会运行。
此外,您应该使用容器和智能指针,而不是原始的new和delete。
发布于 2011-08-01 00:58:44
因为您必须传递new的未更改结果才能删除。这就是事情的工作方式,即new/delete的API契约。
https://stackoverflow.com/questions/6890883
复制相似问题