admin管理员组

文章数量:1608807

 

如需转载请标明出处:http://blog.csdn/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/itas109 

 

 

QQ技术交流群:129518033

 


 

 

本文标签: 时效性问题内存Delete