delete释放内存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delete释放内存相关的知识,希望对你有一定的参考价值。
#include <iostream.h>
void main()
char *p=new char[4];
p="as";
cout<<p<<endl;
//p=NULL;
delete [] p;
为什么delete时会出错。delete本身也是一个变量,我想delete的只是这个指针变量,但不知道为什么会出错,delete释放内存空间的具体过程是什么?前面加上p=NULL;后为什么就没错了?还有有的人说delete后要另指针指向NULL,delete本身就把空间释放了。释放完后是不是指针已经不起作用了?还有必要让它指空吗?还有就是一个指针变量的作用域在申请好变量就定了,那delete完后在这个变量的作用域内到底谁说了算,delete后就无效了还是本身在作用域内都有效?最终我还是想问这个delete释放是怎么个过程。
问题的关键在于你的赋值语句错了。
char *p=new char[4]; // p 是一个指向4个字符的指针
p="as"; // 注意这里,"as" 是一个静态字符串指针
这个赋值语句,是把 "as" 的指针地址,赋给 p。
delete []p; 就变成了释放 "as" 这个静态字符串指针,当然会出错。
应该用字符串复制函数:
strcpy(p, "as");
或者更安全的:
//#include <strsafe.h>
StringCbCopyA(p, 4, "as"); 参考技术B 你释放内存错了,执行你那个赋值语句后,P指向字符串"as",而不是指向你new出来的空间了,所以你释放内存就会出错!本回答被提问者采纳 参考技术C p="as";
这时候p指的地址不再是堆上的了,是常量区。delete只能释放堆上的内存。 参考技术D cout<<p<<endl; --> cout<<*p<<endl;
c++ 内存管理 —— delete释放内存的时效性
c++ 内存管理 —— delete释放内存的时效性
delete释放之后,内容是立即回收的吗?
#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
21908
2
-986292208
1
0
0
0
由上可知,delete后,内存并不是立即被回收。
其实,delete被调用后,表示这块儿内存可以被操作系统重新分配,但是指针还是指向这块儿内存的。虽然指针还是指向原来的位置,但是那一块内存随时都可能会被回收,因此输出的结果是具有不确定性的。所以我们在delete的同时 也要将指针置为NULL 这样在下一次调用该指针时,用if(NULL == p)才能判断出指针的状态,避免使用野指针。
以上是关于delete释放内存的主要内容,如果未能解决你的问题,请参考以下文章
调用 free 或 delete 是不是曾经将内存释放回“系统”