中易网

c++ 指针释放问题

答案:4  悬赏:10  
解决时间 2021-03-06 20:08
测试一:char * aa="abcdefg";delete aa; // 错误!!!程序崩溃
测试二string str="abcdefg";int lg=str.length(); char *bb=new char[lg+1]; strcpy_s(bb,lg+1,str.c_str());
delete [] bb; // 正确
为什么直接赋值 释放指针错误?难道不需要释放指针吗
最佳答案
char * aa="abcdefg";这种写法没有申请内存。所以不需要delete。有new才有delete。
char * aa="abcdefg";这种写法是非常不可取的。可以写成const char* aa = "abcdefg"; 这一块内存指向的区域无法修改值。如果改值就会崩溃。
全部回答
delete bb是bb[0]调用了析构函数,delete[] bb相当于所有对象都调用了析构函数。 一个简单的原则是:new和delete,new[]和delete[] 成对出现。
谁new谁释放,你没new就不要释放。 测试一的aa执行指向静态存储区,是不可修改的。当然也不可释放。

//修改以及解释如下:

#include<iostream.h>

int main(void) { char *p=new char[20]; cin>>p;

char* t=p; //必须得在此处定义一个跟踪指针

//若采用*p方式来访问数组,虽然可以,但是你每次访问,p指针就往后移一位 //直到p指针数组最后一位 while(*t) { if(*t<='z'&&*t>='a') *t-=32; cout<<*t; t++; } cout<<endl;

//此时p指针已经离开了动态分配的储存区,也就是说,你分配了20个字节的单元,p指针已经指向了第21个字节处了! //第21个字节处已经离开了储存区了!此时你再delete的话,释放的将是你没用过的第21个字节的储存单元了!这时候 //系统将无法释放已经分配的内存了,这就是所谓的“内存泄露”问题,是一个十分严重的错误! //p=null;//........① delete []p; p=null; return 0; }

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
哪个知道佛山现在查车厉害吗
法语的nice to meet you怎么说
加计扣除研究开发费用情况归集表怎么填
秋意浓,秋意重,两地相思,一树离愁。这句话
求解我的页面文件怎么是E盘而不是C盘,这样影
德郡四氟石棉化工地址在什么地方,想过去办事
DNF瞎子90b套本命完美打造和魔战完美打造哪个
精彩与哪些词语搭配较好
ODBC数据源管理器——系统DSN——添加——创
九如通津地址在哪,我要去那里办事
农历生日算命运1969年6月1日午时
我的邮政储蓄卡忘记带了,现在急需知道卡号,
梦幻西游新区赚钱问题
老师在公开场合批评我好不好
西瓜在什么时候容易脱水
推荐资讯
炉石传说恐角龙宝宝新卡牌怎么使用 竞技场解
东城卤肉卷怎么去啊,有知道地址的么
世外桃源饮用水好?还是洁澄水业的袋装水好?
花卉中 半阴和阴怎么区分?
ISO9001认证中采购这块应注意哪些,准备哪些资
耳朵隔页纸打印
嘉善县大舜奔马钮扣服饰厂怎么去啊,有知道地
求解签——柳暗花明别有天
牛羊肉小吃怎么去啊,有知道地址的么
荣耀4x畅玩版联系人重复了,怎么办,删除其中一
下周决定反弹是否结束,
谁能告诉我下毕业论文纲要是什么样子的?和提
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?