关于NEW和DELETE的问题

alizhongren 2005-12-12 08:36:20
#include <iostream>
using namespace std;

char * f(char *ps,int size){
char *pc=new char[size];
for (int i=0;i<size;i++)
*(pc+i)=*(ps+i);
*(pc+i)='\0';

return pc;
}

void main(){

char array[10]={'a','b','c','d','e','f','g','h','i','j'};
char *p=f(array,10);
cout<<"p point to the string :"<<endl;
for (int i=0;i<10;i++)
cout<<*(p+i)<<", ";
cout<<endl;

cout<<"p is "<<long(p)<<endl;
cout<<"&p is "<<long(&p)<<endl;
delete []p;
}

这个程序到最后一句的时候有问题,在函数f中new了一段 ,在什么地方delete合适呢?
如果在f的最后加delete我感觉好象有问题,那样的话返回的指针所指的存储区域应该就可以被别的东西填充了吧,不知道我理解的是否正确.请大家帮我看一下在什么地方用delete?
...全文
179 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SnowwhiteYqw 2005-12-13
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

char * f(char *ps,int size){
char *pc=new char[size + 1]; //注意,这里要多分配1个空间存放'\0'。
int i;
for ( i=0;i<size;i++)
*(pc+i)=*(ps+i);
*(pc+i)='\0';

return pc;
}

int main(){

char array[10]={'a','b','c','d','e','f','g','h','i','j'};
char *p=f(array,10);
cout<<"p point to the string :"<<endl;
for (int i=0;i<10;i++)
cout<<*(p+i)<<", ";
cout<<endl;

cout<<"p is "<< reinterpret_cast<int>( p )<<endl;
cout<<"&p is "<< reinterpret_cast<int>( &p ) <<endl;
delete []p;
return 0;
}
大家都说了,我只有发代码了。
alizhongren 2005-12-13
  • 打赏
  • 举报
回复
多谢大家的回复,受益匪浅 ,关于分值少,我也知道,可是我初来乍到,自己的分数就少啊,我也想多给问题些分数,可是没有办法,谢谢了。
csucdl 2005-12-13
  • 打赏
  • 举报
回复
这种问题就值这么多分
csucdl 2005-12-13
  • 打赏
  • 举报
回复
什么问题什么分
zemola 2005-12-12
  • 打赏
  • 举报
回复
呵呵.你的分值太少了..
zemola 2005-12-12
  • 打赏
  • 举报
回复
最好不要在局部函数体使用new,并返回point/reference
两个解决方案:
(1)使用类进行封装,构造器new,析构delete;
(2)使用如下方法:
char* strcpy_(char* strD,const char* strS)
{
size_t n = strlen(strS);
for(;n--;)
strD[n] = strS[n];
return strD;
}
int main()
{
char* source ="abcdefj";
char* dest = new char[strlen(source)];
strcpy_(dest,source);
delete dest;
return 0;
}
pyrophile 2005-12-12
  • 打赏
  • 举报
回复
的确是数组越界的问题。
cunsh 2005-12-12
  • 打赏
  • 举报
回复
楼主理解的对.
happydivid 2005-12-12
  • 打赏
  • 举报
回复
楼主delete [] p;的位置是正确的,只是楼主在函数中开辟空间时,如果想在new数组最后加一个\0的话,应该将长度加1,也就将代码改成这样:char *pc=new char[size+1];
csucdl 2005-12-12
  • 打赏
  • 举报
回复
char * f(char *ps,int size){
char *pc=new char[size];//size + 1
for (int i=0;i<size;i++)
*(pc+i)=*(ps+i);
*(pc+i)='\0'; //这里多了一个元素

return pc;
}

csucdl 2005-12-12
  • 打赏
  • 举报
回复
越界了
dragonzxh 2005-12-12
  • 打赏
  • 举报
回复
char * f(char *ps,int size)
这个函数传进去的指针实际new不到内存,用char**传进去吧

64,637

社区成员

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

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