测试一: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; // 正确
为什么直接赋值 释放指针错误?难道不需要释放指针吗
c++ 指针释放问题
答案:4 悬赏:10
解决时间 2021-03-06 20:08
- 提问者网友:喵星人荷西
- 2021-03-06 05:40
最佳答案
- 二级知识专家网友:颜值超标
- 2021-03-06 06:05
char * aa="abcdefg";这种写法没有申请内存。所以不需要delete。有new才有delete。
char * aa="abcdefg";这种写法是非常不可取的。可以写成const char* aa = "abcdefg"; 这一块内存指向的区域无法修改值。如果改值就会崩溃。
char * aa="abcdefg";这种写法是非常不可取的。可以写成const char* aa = "abcdefg"; 这一块内存指向的区域无法修改值。如果改值就会崩溃。
全部回答
- 1楼网友:丢不掉的轻狂
- 2021-03-06 08:36
delete bb是bb[0]调用了析构函数,delete[] bb相当于所有对象都调用了析构函数。
一个简单的原则是:new和delete,new[]和delete[] 成对出现。
- 2楼网友:甜野猫
- 2021-03-06 08:02
谁new谁释放,你没new就不要释放。
测试一的aa执行指向静态存储区,是不可修改的。当然也不可释放。
- 3楼网友:woshuo
- 2021-03-06 07:38
//修改以及解释如下:
#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; }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯