关于C++中delete释放内存时效性问题
来源:互联网 发布:vscode安装插件 编辑:程序博客网 时间:2024/06/16 01:20
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
测试示例:
#include <iostream>using namespace std;int main(){int *map; int i=10; while(i--) { map=new int[20]; map[i]=i; cout << map[i]<<endl;//1 delete [] map; cout << map[i]<<endl;//2 }}结果:
输出结果
9
9
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
0
0
疑问:
delete释放之后,内容并不是立即回收的吗?
解析:
内存被释放后 表示这块儿内存可以被操作系统重新分配,但是指针还是指向这块儿内存的。虽然指针还是指向原来的位置,但是那一块内存随时都可能会被回收,因此输出的结果是具有不确定性的。所以我们在delete的同时 也要将指针置为NULL 这样在下一次调用该指针时,用if(NULL == p)才能判断出指针的状态,避免使用野指针。
那么,delete之后能不能立即生效呢?
答案肯定是可以的,不过这个也是和操作系统有关的。
在Windows操作系统下,我们通过调用相关的Windows API即可立即让操作系统进行内存回收。
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream> #include <windows.h> #include <psapi.h> #pragma comment(lib,"psapi.lib") using namespace std;void showMemoryInfo(void){HANDLE handle = GetCurrentProcess();PROCESS_MEMORY_COUNTERS pmc;GetProcessMemoryInfo(handle, &pmc, sizeof(pmc));cout << "内存使用:" << pmc.WorkingSetSize / 1000 << "K/" << pmc.PeakWorkingSetSize / 1000 << "K + " << pmc.PagefileUsage / 1000 << "K/" << pmc.PeakPagefileUsage / 1000 << "K" << endl;}int main(int argc, char* argv){showMemoryInfo();cout << "回收所有可回收的内存" << endl;EmptyWorkingSet(GetCurrentProcess());showMemoryInfo();cout << "开始动态分配内存" << endl;char* buf[1];for (int i = 0; i < sizeof(buf) / sizeof(char*); i++){buf[i] = new char[102400];showMemoryInfo();}cout << "开始释放内存" << endl;for (int i = 0; i < sizeof(buf) / sizeof(char*); i++){delete buf[i];buf[i] = NULL;showMemoryInfo();}cout << "回收所有可回收的内存" << endl;EmptyWorkingSet(GetCurrentProcess());showMemoryInfo();return 0;}
结论:delete之后只是程序告诉操作系统这一块内存我需要了,操作系统可以随时回收。至于什么时候回收这一块内存,就是和操作系统有关了,我们无法知道,或者会在很久后回收,或者因为比较着急会立即回收,是具有不确定性的。因此,在delete之后我们要养成立即将指针置为NULL的好习惯!
觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
0 0
- 关于C++中delete释放内存时效性问题
- delete void* 释放内存问题(C++)
- new和delete内存释放问题
- 关于C/C++中内存分配与释放的疑惑?
- 关于内存释放的问题
- UWSGI关于内存释放问题
- C与C++中内存分配释放-malloc,free,new,delete
- delete 与 delete[] 释放内存
- delete 与 delete[] 释放内存
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- 使用delete释放内存
- delete内存释放机制
- 关于block中内存释放
- 7.关于申请与释放内存new & delete
- c++, delete无法释放内存,太奇怪了
- SELinux入门:模式查看与切换
- 并发编程--原子类AtomicLong、AtomicBoolean和AtomicReference
- 【redis】主从复制
- SSL设置免密登录
- JavaWeb(6)-Maven Setup and Quick Use
- 关于C++中delete释放内存时效性问题
- FreeRTOS笔记:堆内存管理
- spring 依赖注入后的行为
- Action_移入改变
- 记录我的Windows编程(二)贴张图片
- Java内存模型:JMM简单介绍
- Drools 6.2.0 Workbench 部署
- Java NIO系列教程(一) Java NIO 概述
- 网页标题带小图标