问题描述
- 小白真心提问C++ delete,为啥连最基本的也会报错嘛
-
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode (int x): val(x), next(NULL) {} }; int main(int argc, char const *argv[]) { // ListNode n1(2); // ListNode dummy(0); // dummy.next = &n1; // ListNode *p = &dummy; // delete p; int *p = new int; int t = 10; p = &t; delete p; return 0; }
如上所示,刚接触内存分配,百度了好些东西了,不明白为什么连这个最基本的分配和释放都会报错pointer being freed was not allocated,真心求助
解决方案
因为你改变了指针,你试图分配堆栈上的t,当然出错
int *p = new int;
int t = 10;
int *p1=p;
p = &t;
delete p1;
解决方案二:
delete 只能删除你自己用分配内存函数创建的内存
你想想,如果你能使用delete删除一块内存地址没有限制的话,你要是知道一些系统核心变量地址的内存可不都给干掉了
所以有一些东西delete是不能操作的。
在c++中 new 和delete 是一对。
只能删除这个new 出来的内存
你看书上也说 在new 的变量的时候,一定要写出析构函数进行它的释放
所以啊,养成好的编程习惯
有new 的地方,一定要设置对应的delete 也就是把你的析构函数写出来
解决方案三:
new就是向系统“借”内存,delete是“还”。你借了一块内存,放在p这个盒子里,后来你把别的东西放p这个盒子里,然后说把盒子里的东西还给系统,系统当然不干了
解决方案四:
你还没建立堆区和栈区的概念,琢磨下概念就会了。t的内存是你不能操作的,也就是不能delete的。你能delete的只是你自己new的内存。
堆和栈的区别
一、预备知识—程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收 。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
解决方案五:
小型的内存泄漏...指针p 已被创建了空间,然后又指向了另一个空间,要不管不顾去删除的话用 p = NULL 就可以了 p 也不用new int;