关于operator+导致内存错误

yangyijk 2014-01-01 09:33:29
这是+的源码:
exstring operator+(const exstring &exstr_f, const exstring &exstr_s){
exstring ex;
if (!exstr_f.construct_ptr){
ex = exstr_f;
if (!exstr_s.construct_ptr){
ex = exstr_s;
}
}
else{
ex.construct_ptr = new char[strlen(exstr_f.construct_ptr) + strlen(exstr_s.construct_ptr) + 1];
strcpy(ex.construct_ptr, exstr_f.construct_ptr);
strcat(ex.construct_ptr, exstr_s.construct_ptr);
}
return ex;
}

这是=的源码:
exstring &exstring::operator=(const exstring &exstr){
if (this == &exstr){
return *this;
}
construct_ptr = NULL;

int length = strlen(exstr.construct_ptr);
construct_ptr = new char[length + 1];
strcpy(construct_ptr, exstr.construct_ptr);

return *this;
}

类应该没有问题,而且我没有用构造函数删除construct_ptr,但是这样调用就会出错
exstring sx;
exstring a("abc");
exstring b("p");
sx=a + b;
...全文
145 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyijk 2014-02-02
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
ex.construct_ptr = new char[strlen(exstr_f.construct_ptr) + strlen(exstr_s.construct_ptr) + 1]; 看你这句就可能要出问题了. 这里new了, 你在哪里delete呢? 如果你说在析构函数中, 那么崩溃是肯定的了. 因为你的ex是栈变量, 在+结束后, 这个类会被析构,也就是ex.construct_ptr已经是野指针了. 再返回的临时对象会拥有相同的指针, 但已经是野指针, 再使用就非法了. 建议好好读下CStringT类的源码学习下吧.
我也想delete,但是似乎没法删除
xiaohuh421 2014-01-02
  • 打赏
  • 举报
回复
ex.construct_ptr = new char[strlen(exstr_f.construct_ptr) + strlen(exstr_s.construct_ptr) + 1]; 看你这句就可能要出问题了. 这里new了, 你在哪里delete呢? 如果你说在析构函数中, 那么崩溃是肯定的了. 因为你的ex是栈变量, 在+结束后, 这个类会被析构,也就是ex.construct_ptr已经是野指针了. 再返回的临时对象会拥有相同的指针, 但已经是野指针, 再使用就非法了. 建议好好读下CStringT类的源码学习下吧.
lm_whales 2014-01-01
  • 打赏
  • 举报
回复
构造函数没有初始化construct_ptr,没有用析构函数删除construct_ptr 也是错误 operator+ 实现的也很离谱
derekrose 2014-01-01
  • 打赏
  • 举报
回复
运行时错误 请自行调试 论坛不是debugger
lm_whales 2014-01-01
  • 打赏
  • 举报
回复
operator=错误
vipcxj 2014-01-01
  • 打赏
  • 举报
回复
LS+1 你到底是编译报错,还是运行报错?如果是编译报错,上错误提示,如果运行报错,上你debug后自己的看法,或者出现的异常说明(虽然大部分异常都是野指针这种几乎看不出任何东西的异常) 还有你的加法重载可能需要类里面声明友元,你完全不给类的代码让我们无从判断
taodm 2014-01-01
  • 打赏
  • 举报
回复
你需要去google “提问的智慧”
yangyijk 2014-01-01
  • 打赏
  • 举报
回复
实在找不出错误了,求解

64,281

社区成员

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

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