首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用释放的内存真的会崩溃吗?

使用释放的内存真的会崩溃吗?
EN

Stack Overflow用户
提问于 2014-01-17 16:04:23
回答 6查看 309关注 0票数 1

下面的代码访问不再分配的内存。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
        int * ptr = new int(5);
        delete ptr;
        return *ptr;
}

指针访问内存的权限不再分配,但在内存可访问之前,它只返回一个值。我想知道,实际上,该程序是否有可能以分段违规信号而崩溃。

编辑:我在一个循环中运行了超过100000次,没有崩溃,这并不意味着它永远不会崩溃,只是它没有崩溃在这100000次。也许用这么简单的程序是不可能的?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-20 18:16:05

与分割冲突(基于Thomas的例子)崩溃的案例可以是:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main()
{
        size_t size = 1024*1024;
        char *ptr = new char[size];
        memset(ptr,255,size);
        delete [] ptr;
        return ptr[0];
}
票数 0
EN

Stack Overflow用户

发布于 2014-01-17 16:05:16

我想知道,这是否有可能使程序崩溃与分割,违规信号或类似的事情。

是。取消引用已删除的指针是未定义的行为。其中一件事可能会发生,那就是坠机。另一个原因是程序可以在没有任何问题的情况下悄然退出。

票数 6
EN

Stack Overflow用户

发布于 2014-01-17 16:29:00

ptr仍然包含一个内存地址。是否在进程上下文中访问此特定地址取决于操作系统内存管理的状态,以及系统的C++编译器的堆管理是否会返回由于删除而释放的内存到OS内存管理。如果它消失了,你会看到一个片段违规。

但是,访问地址仍然是可能的,并且您的程序不会因为非法侵入而终止。但是,即使这是确定的,您也无法保证main返回的值仍然是删除之前保存的变量的值。堆内存管理是一个非常复杂的软件,在返回内存块时不知道会发生什么。

最后,如果您的程序使用线程,另一个线程可能已请求内存,并接收并更改了几纳秒前返回的内容。

所以:不要,永远不要!

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

https://stackoverflow.com/questions/21190406

复制
相关文章

相似问题

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