C++函数里申请的动态数组,如何释放

腊八节 2014-09-07 11:48:30
#include <stdio.h>
#include <STACK>
#include <iostream>
using namespace std;

/*判断表达式是否合法*/
bool IsValid(char * str)
{
if(NULL==str)
return false;
stack<char> op;
while (*str)
{
if(*str=='(')
op.push(*str++);
else if (*str==')')
{
if(op.empty())
return false;
else
{
op.pop();
}
str++;
}
else
str++;
}
if(op.empty())
return true;
else
return false;
}
//消除中间括号
char *Elimination_brackets_1(char *str)
{
if(NULL==str)
return str;
char *temp=new char[strlen(str)+1];
char *result=temp;
*temp=*str;
//cout<<*temp<<endl;
temp++;
str++;
while (*str!='\0')
{
if (*str==')'||*str=='(')
{
str++;
continue;
}
(*temp++)=*str++;
}
*temp++=')';
*temp='\0';
cout<<result<<endl;
return result;
}
void main()
{
char str[]="(1,(2,3),(4,(5,6),7))";
if(IsValid(str))
{
//printf(Elimination_brackets_1(str));
char *p=Elimination_brackets_1(str);
cout<<str<<endl;
cout<<p<<endl;
delete []p;
cout<<p<<endl;

}

getchar();
}


请问,这个动态数组,我最后用指针指向它,释放时候用delete []p,还是用delete p;

两个运行的结果都是不能访问内存了,出了乱码,但是这个乱码的原因会不会是我只释放了第一个字符的内存,导致后面的内存不能有效访问呢?
...全文
754 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
腊八节 2014-09-07
  • 打赏
  • 举报
回复
引用 1 楼 wanght99 的回复:
应该是 delete [] p, 对 new []的内存, 用不加[]的delete结果未定义.
不加[]的delete的结果未定义,在程序里跑出来跟加了[]的结果一样啊。 如果在函数里面释放肯定是加[] 但是因为是把数组通过指针的形式传递出来了,并且付给了新的指针p,,而P仅仅是指针,这个不会有影响么?
wanght99 2014-09-07
  • 打赏
  • 举报
回复
应该是 delete [] p, 对 new []的内存, 用不加[]的delete结果未定义.
腊八节 2014-09-07
  • 打赏
  • 举报
回复
引用 4 楼 wanght99 的回复:
[quote=引用 2 楼 peng10101010 的回复:] [quote=引用 1 楼 wanght99 的回复:] 应该是 delete [] p, 对 new []的内存, 用不加[]的delete结果未定义.
不加[]的delete的结果未定义,在程序里跑出来跟加了[]的结果一样啊。 如果在函数里面释放肯定是加[] 但是因为是把数组通过指针的形式传递出来了,并且付给了新的指针p,,而P仅仅是指针,这个不会有影响么?[/quote] "未定义"的意思是程序可能跟预期一样, 也可能跟预期不一样, 玩笑地讲, 就算程序抽风把你的硬盘格式化了, 你也不能说它编译器有问题, 因为标准里醒来就没对这种情况下的行为有要求. 你说的"但是因为是把数组通过指针的形式传递出来了", 答案是没影响, 指针本身并不知道它指向的是单个变量还是连续多个变量, 编译器也不管new出的指针被赋值多少次, 是函数里还是被当作函数返回值传递过, delete的时候, 只看地址, 和你是怎么new的, 进程是另外维护了一套数据结构来管理new/delete内存的, 跟分配的内存怎么用完全没有关系. 你可以看一下你的程序 char *p char *temp=new char[strlen(str)+1]; p和temp类型完全一样, 编译器不可能根据这两个变量本身去区分它们指向的是一个数组还是单个值.[/quote] 谢谢你,我结贴了,给分
腊八节 2014-09-07
  • 打赏
  • 举报
回复
引用 5 楼 OrthocenterChocolate 的回复:
用new+[ ] 的形式分配的内存,是应该用delete [ ] 的形式去释放,当你用delete [ ] 的形式去释放的时候,它会去查找内存中保存的数组的大小,以便知道要从哪删到哪,如果仅仅是delete,则不会认为是在删一个数组。请问楼主所说的“出了乱码”是指什么?如果是delete后再输出,那必须是乱码。
就是输出了一些汉字类的东西,看来就应该是用delete [],谢谢你们俩,我结贴啦
Kenney_Qin 2014-09-07
  • 打赏
  • 举报
回复
用new+[ ] 的形式分配的内存,是应该用delete [ ] 的形式去释放,当你用delete [ ] 的形式去释放的时候,它会去查找内存中保存的数组的大小,以便知道要从哪删到哪,如果仅仅是delete,则不会认为是在删一个数组。请问楼主所说的“出了乱码”是指什么?如果是delete后再输出,那必须是乱码。
wanght99 2014-09-07
  • 打赏
  • 举报
回复
引用 2 楼 peng10101010 的回复:
[quote=引用 1 楼 wanght99 的回复:] 应该是 delete [] p, 对 new []的内存, 用不加[]的delete结果未定义.
不加[]的delete的结果未定义,在程序里跑出来跟加了[]的结果一样啊。 如果在函数里面释放肯定是加[] 但是因为是把数组通过指针的形式传递出来了,并且付给了新的指针p,,而P仅仅是指针,这个不会有影响么?[/quote] "未定义"的意思是程序可能跟预期一样, 也可能跟预期不一样, 玩笑地讲, 就算程序抽风把你的硬盘格式化了, 你也不能说它编译器有问题, 因为标准里醒来就没对这种情况下的行为有要求. 你说的"但是因为是把数组通过指针的形式传递出来了", 答案是没影响, 指针本身并不知道它指向的是单个变量还是连续多个变量, 编译器也不管new出的指针被赋值多少次, 是函数里还是被当作函数返回值传递过, delete的时候, 只看地址, 和你是怎么new的, 进程是另外维护了一套数据结构来管理new/delete内存的, 跟分配的内存怎么用完全没有关系. 你可以看一下你的程序 char *p char *temp=new char[strlen(str)+1]; p和temp类型完全一样, 编译器不可能根据这两个变量本身去区分它们指向的是一个数组还是单个值.
熊熊大叔 2014-09-07
  • 打赏
  • 举报
回复
delete p;和delete []p; 的区别是前者只调用一次析构函数,后者会调用多次析构函数。 因为new的时候调用过多次构造函数,所以delete时也需要调用多次析构函数,不管是不是做过类型转换。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧