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释放是怎么个过程。

参考技术A p=NULL; 之后,就变成 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 是不是曾经将内存释放回“系统”

怎么用new定义一个类数组,并且释放内存

C++ 关于内存泄露问题。内存泄露是指用new 分配的内存没有用delete释放,如果未释放会有啥后果?

为啥我delete后内存没有被释放?

析构函数为啥能释放对象内存?

New动态分配 Delete 释放内存