局部指针变量指向堆空间的释放问题

zhaodanhui1993 2014-07-19 10:24:27
#include<iostream.h>
#include<string.h>
//using namespace std;
class String
{
public:
String(const char* s="")
{
if(s==NULL)
str=NULL;
else
{
str=new char[(strlen(s)+1)];
strcpy(str,s);
}
}
String(const String& s)
{
if(s.str==NULL)
str=NULL;
else
{
str=new char[(strlen(s.str)+1)];
strcpy(str,s.str);
}
}
String& operator=(const String& s)
{
if(this!=&s)
{
delete []str;
str=new char[strlen(s.str)+1];
for(int i=0;i<=strlen(s.str);i++)
{
str[i]=s.str[i];
}
}
return *this;
}
bool operator==(const String& s)
{
if(this==&s)
return true;
else
{
if(strlen(str)!=strlen(s.str))
return false;
else
{
for(int i=0;i<strlen(str);i++)
{
if(str[i]!=s.str[i])
return false;
}
return true;
}
}
}
String operator+(String& s)
{
int t=0;
String p;
p.str=new char[strlen(str)+strlen(s.str)+1];
strcpy(p.str,str);
for(long i=strlen(str);i<=(strlen(str)+strlen(s.str));i++)
{
p.str[i]=s.str[t];
t++;
}
return p;
}
char& operator[](int i){return str[i];}
const char& operator[](int i)const{return str[i];}
~String(){delete []str;}
friend istream& operator>>(istream& in,String& s);
friend ostream& operator<<(ostream& out,const String& s);
private:
char* str;

};
istream& operator>>(istream& in,String& s)
{
char s0[100];
in>>s0;
s.str=new char[strlen(s0)+1];
strcpy(s.str,s0);
return in;
}
ostream& operator<<(ostream& out,const String& s)
{
cout<<s.str;
cout<<endl;
return out;
}
int main()
{
String s1;
cout<<"enter s1:";
cin>>s1;
String s2;
cout<<"enter s2:";
cin>>s2;
cout<<"s1+s2="<<(s1+s2);

String s3(s1);
if(s1==s3){cout<<"s1=s3"<<endl;}
s3=s2;
cout<<s3;
s3[0]='p';
cout<<s3;
return 0;
}
...全文
238 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-07-23
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
梦想照旧实现 2014-07-23
  • 打赏
  • 举报
回复
引用 2 楼 foruok 的回复:
看析构函数: ~String(){delete []str;} operator+() 函数内的局部对象 p ,在函数返回后就析构了,调用者会拿到一个新的 String 对象(通过拷贝构造函数,以p为参数创建)。 博文决赛,投我一票,谢谢。
正解!
ForestDB 2014-07-22
  • 打赏
  • 举报
回复
没有什么问题,一个简单的测试方法: ~String () { cout << str << endl; delete[]str; } enter s1:abc enter s2:def s1+s2=abcdef delete: abcdef s1=s3 def pef delete: pef delete: def delete: abc
foruok 2014-07-19
  • 打赏
  • 举报
回复
看析构函数: ~String(){delete []str;} operator+() 函数内的局部对象 p ,在函数返回后就析构了,调用者会拿到一个新的 String 对象(通过拷贝构造函数,以p为参数创建)。 博文决赛,投我一票,谢谢。
zhaodanhui1993 2014-07-19
  • 打赏
  • 举报
回复
我想问一下+重载的函数里的局部对象p所new出来的空间释放没?若没释放,怎么释放?
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

64,654

社区成员

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

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