运行时检测内存删除

bay*_*der 2 c++ windows pointers memory-corruption

代码:

int *ptr = new int[10];
int *q = ptr;
delete q;
Run Code Online (Sandbox Code Playgroud)

工作正常没有任何问题(没有运行时错误).

但是,以下代码:

int *ptr = new int[10];
int *q = ptr;
q++;
delete q;
Run Code Online (Sandbox Code Playgroud)

导致运行时错误.

我使用Microsoft Visual Studio-8和Win-7作为平台.

我无法弄清楚为什么在第二种情况下会出现运行时错误?

Alo*_*ave 9

您的代码导致未定义的行为.未定义的行为意味着任何事情都可能发生,行为无法定义.该计划只是运气纯粹,其行为无法解释.

基本上,

如果你是动态分配内存new,你必须使用delete释放它.

如果你是动态分配内存new[],你必须使用delete[]释放它.

传递delete未返回的任何地址是未定义的行为new.
以下是标准的引用.

根据C++ 03标准§3.7.4.2-3:

如果通过抛出异常终止释放函数,则行为未定义.提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.否则,delete(void*)在标准库中提供给操作符的值应该是先前调用任何操作符new(std::size_t)operator new(std::size_t, const std::nothrow_-t&)在标准库中返回的值之一,并且提供给delete[](void*)标准库中的操作符的值应该是由a返回的值之一.以前调用任何一个operator new[](std::size_t)operator new[](std::size_t, const std::nothrow_t&)在标准库中.

在C++中,最好使用智能指针而不是原始指针来使用RAII(SBRM),这会自动处理内存释放.