首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存删除的运行时检测

内存删除的运行时检测
EN

Stack Overflow用户
提问于 2011-08-01 00:56:23
回答 4查看 129关注 0票数 2

代码:

代码语言:javascript
复制
int *ptr = new int[10];
int *q = ptr;
delete q;

运行正常,没有任何问题(没有运行时错误)。

但是,以下代码:

代码语言:javascript
复制
int *ptr = new int[10];
int *q = ptr;
q++;
delete q;

导致运行时错误。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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++中,最好通过使用智能指针来使用,而不是使用原始指针,它会自动处理内存释放。

票数 9
EN

Stack Overflow用户

发布于 2011-08-01 01:00:06

这里有两个错误:

不能使用new.

  • You返回的指针,也不能delete delete new[]返回的指针-您需要使用delete[].

因此,第一个代码片段只是巧合地工作,并且没有错误,因为您使用的是原语类型。如果是UDT,析构函数就不会运行。

此外,您应该使用容器和智能指针,而不是原始的newdelete

票数 3
EN

Stack Overflow用户

发布于 2011-08-01 00:58:44

因为您必须传递new的未更改结果才能删除。这就是事情的工作方式,即new/delete的API契约。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6890883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档