[求看5行代码]为什么delete后的内存空间还能被继续操作?

hellenismsssss 2014-01-05 02:27:41
环境: mac ox 10.9.1
IDE: xcode 5.0.2


int* pp = new int(100);
delete pp;
cout << (*pp) << endl;
(*pp) = 1; //申请的空间不是被释放了吗?怎么还能操作?
cout << (*pp) << endl;


程序输出:
100
1

请问是为什么? delete pp , 那么pp指向的空间应该被释放了呀,为什么还能修改里面的值?
...全文
199 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellenismsssss 2014-01-06
  • 打赏
  • 举报
回复
引用 12 楼 baipv008 的回复:
希望能让看了这个帖子的人不要再问“内存释放了为什么还能使用”类似问题了。 int* p=new int[10]; //你向房东租了间房子,房东给你一把钥匙p p[0]=1234; //你开始使用这间房子,扔了一堆你的东西 delete[] p; //你向房东退房了 //p=NULL; //你把钥匙还了,如果没有这句就是你没还钥匙 cout <<p[0]; //你明明退了房子,但没有还钥匙。然后还用这把钥匙开门进去。 //这时有三种结果:(1)房子还是老样子,你扔的东西都还在,就像你没退房一样 // (2) 房子已经被房东收拾过了,你的东西被扔掉了。 // (3) 房子已经被租给其他人了,你被当做小偷暴打了一顿。 最后,请记住:退房记得还钥匙。
很具体,谢谢
  • 打赏
  • 举报
回复
请仔细阅读: for very good reasons, the memory allocator does not return memory to the host OS but keeps it (internally in your program's data space) as a free list of some kind. Some of the reasons the library keeps the memory are: Interacting with the kernel is much slower than simply executing library code The benefit would be small. Most programs have a steady-state or increasing memory footprint, so the time spent analyzing the heap looking for returnable memory would be completely wasted. Internal fragmentation makes page-aligned blocks (the only thing that could be returned to the kernel) unlikely to exist, another reason not to slow the program down looking for something that won't be there. Returning a page embedded in a free block would fragment the low and high parts of the block on either side of the page. The few programs that do return large amounts of memory are likely to bypass malloc() and simply allocate and free pages anyway using mmap(2).
  • 打赏
  • 举报
回复
引用 楼主 hellenismsssss 的回复:
环境: mac ox 10.9.1 IDE: xcode 5.0.2

    int* pp = new int(100);
    delete pp;
    cout << (*pp) << endl;
    (*pp) = 1; //申请的空间不是被释放了吗?怎么还能操作?
    cout << (*pp) << endl;
程序输出: 100 1 请问是为什么? delete pp , 那么pp指向的空间应该被释放了呀,为什么还能修改里面的值?
delete的本质是,删除指向地址块的数据,告诉系统,这块内存我已经不再需要了,你可以管理了;;; 但是指针仍然健在, 我的理解是这样的,不知道你现在的答案是什么?
  • 打赏
  • 举报
回复
引用 楼主 hellenismsssss 的回复:
环境: mac ox 10.9.1 IDE: xcode 5.0.2

    int* pp = new int(100);
    delete pp;
    cout << (*pp) << endl;
    (*pp) = 1; //申请的空间不是被释放了吗?怎么还能操作?
    cout << (*pp) << endl;
程序输出: 100 1 请问是为什么? delete pp , 那么pp指向的空间应该被释放了呀,为什么还能修改里面的值?
指针只是指向一块内存。。至于你在delete;后,这个指针指向的值是什么就难以预料了;
lpcads 2014-01-05
  • 打赏
  • 举报
回复
引用 7 楼 hellenismsssss 的回复:
[quote=引用 1 楼 derekrose 的回复:] 如果让你实现delete 你会怎么做
我会delete内存空间之后,把里面的数据恢复为默认值,并且标记为可用,以至于new操作符可以使用此块内存[/quote] 幸亏delete不是你实现的 根本没必要“把里面的数据恢复为默认值”。 内存读写的一项原则是:尽可能地避免写入。
lin5161678 2014-01-05
  • 打赏
  • 举报
回复
你闯红灯之后问为什么没被撞死?
xinhua0910 2014-01-05
  • 打赏
  • 举报
回复
delete只是释放了你申请的空间,但pp仍然指在原来的地方,只是没有自己的空间而已。 此时你给赋值,还是可以的,但这就是野指针的问题。 如果他原来申请那块空间没有其他程序在用,你给赋值了影响还不大,如果刚好此时空间被其他重要程序给使用了,你去修改了他的值问题就大了。 好的习惯就是 delete、free后,将指针指向NULL
千树之影 2014-01-05
  • 打赏
  • 举报
回复
希望能让看了这个帖子的人不要再问“内存释放了为什么还能使用”类似问题了。 int* p=new int[10]; //你向房东租了间房子,房东给你一把钥匙p p[0]=1234; //你开始使用这间房子,扔了一堆你的东西 delete[] p; //你向房东退房了 //p=NULL; //你把钥匙还了,如果没有这句就是你没还钥匙 cout <<p[0]; //你明明退了房子,但没有还钥匙。然后还用这把钥匙开门进去。 //这时有三种结果:(1)房子还是老样子,你扔的东西都还在,就像你没退房一样 // (2) 房子已经被房东收拾过了,你的东西被扔掉了。 // (3) 房子已经被租给其他人了,你被当做小偷暴打了一顿。 最后,请记住:退房记得还钥匙。
zhuobattle 2014-01-05
  • 打赏
  • 举报
回复
我觉得这样的尝试没有太大意义,进程内很多内存地址都有可能可以访问 但是这样做是很危险的。
未注销 2014-01-05
  • 打赏
  • 举报
回复
引用 8 楼 hellenismsssss 的回复:
[quote=引用 2 楼 AfterSeptember 的回复:] 你确定会这样输出?
是这样输出的[/quote] 要输出100,1也应该delete pp放在第一个cout后面,你这样能输出100,1那就奇怪了。
sleeplacker 2014-01-05
  • 打赏
  • 举报
回复
苹果系统啊 你的编译器和我们的不同,我的输出结果是: -572662307 1 可能是你的编译器在使用了delete以后指针仍然指向原来的地址(也就是说上面的数据还是原来的),但是这个地址和原来不同,因为他已经不是你分配的空间了,而是和其他空间一样可以再分配 要想让pp不指向任何地址只能让他指向nullptr
#include<iostream>
using namespace std;

int main()
{
	int* pp = new int(100);
	delete pp;
	pp = nullptr;
	cout << (*pp) << endl;
	(*pp) = 1; //申请的空间不是被释放了吗?怎么还能操作?
	cout << (*pp) << endl;
	return 0;
}
hellenismsssss 2014-01-05
  • 打赏
  • 举报
回复
引用 2 楼 AfterSeptember 的回复:
你确定会这样输出?
是这样输出的
hellenismsssss 2014-01-05
  • 打赏
  • 举报
回复
引用 1 楼 derekrose 的回复:
如果让你实现delete 你会怎么做
我会delete内存空间之后,把里面的数据恢复为默认值,并且标记为可用,以至于new操作符可以使用此块内存
hellenismsssss 2014-01-05
  • 打赏
  • 举报
回复
引用 3 楼 oYinGui1 的回复:
指针的生命周期还没结束之前,你释放了空间,但不给指针赋值nullptr,指针会仍然指向那部分空间的,虽然那部分空间现在是未定义的,那你依旧可以通过它的地址去修改它什么的。
谢谢
Pump天天学习 2014-01-05
  • 打赏
  • 举报
回复
被释放意味着你告诉系统:“这块空间我用完了,还给你了”。所以系统说不定什么时候会往这块空间内存放新的内容,所以要是继续操作这块空间的话是极其危险的

delete ptr;
ptr=NULL;//释放完之后给指针赋NULL
Morrisss_ 2014-01-05
  • 打赏
  • 举报
回复
引用 3 楼 oYinGui1 的回复:
指针的生命周期还没结束之前,你释放了空间,但不给指针赋值nullptr,指针会仍然指向那部分空间的,虽然那部分空间现在是未定义的,那你依旧可以通过它的地址去修改它什么的。
delete是释放空间,让动态分配的空间变得无意义。但不是去删除指针,让指针无意义。所以指针没赋值nullptr还能用,这不奇怪。
Morrisss_ 2014-01-05
  • 打赏
  • 举报
回复
指针的生命周期还没结束之前,你释放了空间,但不给指针赋值nullptr,指针会仍然指向那部分空间的,虽然那部分空间现在是未定义的,那你依旧可以通过它的地址去修改它什么的。
未注销 2014-01-05
  • 打赏
  • 举报
回复
你确定会这样输出?
derekrose 2014-01-05
  • 打赏
  • 举报
回复
如果让你实现delete 你会怎么做

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧