2 sharonlyu sharonlyu 于 2016.01.31 08:05 提问

小白真心提问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,真心求助

5个回答

caozhy
caozhy   Ds   Rxr 2016.01.31 08:12
已采纳

因为你改变了指针,你试图分配堆栈上的t,当然出错

     int *p = new int;
    int t = 10;
    int *p1=p;
    p = &t;
    delete p1;
sharonlyu
sharonlyu 非常感谢!我现在明白了~
接近 2 年之前 回复
caozhy
caozhy 回复91program: 有时候你也看到了,我会花半个小时帮lz调试一个程序,我为这个网站贡献了几万个问题。当然,有时我的回答也不是特别好,有时候我也为不能帮助lz而遗憾,但是无论如何,我为一些网友能得到帮助而高兴。也为论坛和问答的发展而高兴。我说这些不知道你是否感同身受。看到那些草率做出的,毫无意义的回答,就如同干净的地面上被人丢了烟头。csdn是我们共同的家园。希望大家能爱护它。
接近 2 年之前 回复
caozhy
caozhy 回复91program: 之所以提醒你注意回帖质量,我认为有这么两个原因,一个是你是态度问题,而不是能力问题。也就是我觉得你是可以好好回答问题的。另一个我觉得你是一个拥有正常思维,并且希望得到别人尊重的人,我向你道歉的目的是我的方式方法可能对于一个年长者我希望采用你能接受的方式和你沟通。但是同时你有问题,我也一再提醒下,因为我在尊重你的同时也希望csdn好。
接近 2 年之前 回复
91program
91program 一个小心眼的家伙,以前也没有见你对我的回答评论过。 在你爷爷说了你后,天天跟你爷爷过不去。你想干什么!? 在CSDN 的问答群里道歉,然后来这里继续当小人。你究竟想干什么? caozhy 说你呢,出来溜溜吧。
接近 2 年之前 回复
fk002008
fk002008   2016.01.31 23:51

delete 只能删除你自己用分配内存函数创建的内存
你想想,如果你能使用delete删除一块内存地址没有限制的话,你要是知道一些系统核心变量地址的内存可不都给干掉了
所以有一些东西delete是不能操作的。

在c++中 new 和delete 是一对。
只能删除这个new 出来的内存

你看书上也说 在new 的变量的时候,一定要写出析构函数进行它的释放
所以啊,养成好的编程习惯

有new 的地方,一定要设置对应的delete 也就是把你的析构函数写出来

xyz347
xyz347   2016.01.31 09:03

new就是向系统“借”内存,delete是“还”。你借了一块内存,放在p这个盒子里,后来你把别的东西放p这个盒子里,然后说把盒子里的东西还给系统,系统当然不干了

sharonlyu
sharonlyu 非常形象!谢谢!
接近 2 年之前 回复
xinqingwuji
xinqingwuji   2016.01.31 10:38

你还没建立堆区和栈区的概念,琢磨下概念就会了。t的内存是你不能操作的,也就是不能delete的。你能delete的只是你自己new的内存。
堆和栈的区别
一、预备知识—程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收 。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

wm30wm5125
wm30wm5125   2016.01.31 08:17

小型的内存泄漏...指针p 已被创建了空间,然后又指向了另一个空间,要不管不顾去删除的话用 p = NULL 就可以了 p 也不用new int;

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!