关于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;
...全文
102 点赞 收藏 8
写回复
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日
实在找不出错误了,求解
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告