c++- 小白真心提问C++ delete,为啥连最基本的也会报错嘛

问题描述

小白真心提问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;

时间: 2025-01-20 12:46:41

c++- 小白真心提问C++ delete,为啥连最基本的也会报错嘛的相关文章

新手提问:访问页面不显示,控制台怎么不报错呢?!!

问题描述 新手提问:访问页面不显示,控制台怎么不报错呢?!! 解决方案 访问项目的主页时不报错,控制台也不报错,这不应该啊 不报错怎么调试啊 啊啊啊啊啊啊啊啊啊 解决方案二: 你换个浏览器试试,这个显示错误提示代码与否浏览器可以设置的,具体怎么设置你可以百度查,但是最简便的就是换个浏览器试试

vc6-初学者提问,为什么这段代码在VC6.0上会报错

问题描述 初学者提问,为什么这段代码在VC6.0上会报错 #include #include main() {int s; float n , t , pi; t = 1.0; pi = 0; n = 1.0; s = 1; while( fabs(t) >= 1e - 6) { pi = pi + t; n += 2.0; s = -s; t = s/n; } pi = pi*4; printf("pi = %fn", pi) } 就是这段代码,我个人看也觉得没什么错误,可就是

使用vc++6.0编单链表一直报各种错,小白真心求解

问题描述 使用vc++6.0编单链表一直报各种错,小白真心求解 /list.h/#include templateclass TLinkList; templateclass TNode{private: T data; //数据 TNode *next;//指向下一个节点的指针public: friend class TLinkList;//申请是链表类的友元类 TNode(T data=0TNode *q=NULL); ~TNode(void);}; templateclass TLinkL

c++-(C++)小白来提问,程序出错。

问题描述 (C++)小白来提问,程序出错. #include using namespace std; double capital = 0.0; double cal(int num, double quantity) { switch (num) { case 0: return quantity*1.50; case 1: return quantity*1.70; case 2: return quantity*4.60; case 3: return quantity*0.90; ca

c++-C++小白来提问关于strcmp的问题

问题描述 C++小白来提问关于strcmp的问题 我用strcmp()来比较两个字符串A和B A="HelloWorld" B="Hello World" 结果是B比A小 不明白啊,不是空格算1字符么,怎么B还比A小呢? 解决方案 strcmp(A,B); 相当于: strcmp("HelloWorld" , "Hello World"); 这个比较函数的功能是把上面这两个字符串中的每一个字符的ASC码值进行比较,遇到''或者

小白来提问啦,&amp;amp;amp;和&amp;amp;amp;&amp;amp;amp;在编码中的区别有多大?

问题描述 小白来提问啦,&和&&在编码中的区别有多大? 学java的时候,教材里提到过&&比&更快捷所以称为简洁与,但是,与&的差别真的很大么? 有没有谁举一个比较直观的例子来说说. 解决方案 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)也叫短路与. 逻辑操作(&,|,)与条件操作(&&,||)的区别. 区别主要答两点: 1.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型

css-CSS编辑问题,小白真心求教,求好心人解惑

问题描述 CSS编辑问题,小白真心求教,求好心人解惑 .main-nav .m1 { background: url("no1.png"/*tpa=http://www.xxxxxx.com/1124img/no1.png*/) no-repeat 0 0;} 这代码有错么. 为什么IE打开不显示图片, 用UC浏览起打开可以显示. 解决方案 一看就是网站小偷a下来的代码,用dw打开css,正则替换掉注释,不支持那样写注释,uc支持比较奇葩,chrome,firefox都没有效果 解决方

c++-C++小白来提问,关于回文数

问题描述 C++小白来提问,关于回文数 编写回文数的代码中遇到这么一段 int i = 0; int j = 0; while ((i <= (int)strlen(str) / 2) && (j == 0)) { if (*(str + i) == *(str + (strlen(str) - i) - 1)) { i++; } else j = 1; } return j == 0 ? 1 : 0; 这段怎么理解啊,尤其是 if (*(str + i) == *(str + (s

c-小白求助 运行为啥报错啊?看下图

问题描述 小白求助 运行为啥报错啊?看下图 函数定义和声明如图所示,感觉没错啊 为啥报错啊 解决方案 C是没有bool类型 解决方案二: 这么详细的错误报告..... 解决方案三: bool能返回 0,1 么,是true,false吧 解决方案四: 这个编译器版本太旧了,换个新版本吧 解决方案五: judgecoline 这个函数是类函数吗?是类函数怎么不带类名,如果不是为何要在类头文件声明呢? 解决方案六: judgecoline 这个函数是类函数吗?是类函数怎么不带类名,如果不是为何要在类头