首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于operator+导致内存异常

2014-01-03 
关于operator+导致内存错误这是+的源码:exstring operator+(const exstring &exstr_f, const exstring &ex

关于operator+导致内存错误
这是+的源码:
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;

[解决办法]
ex.construct_ptr = new char[strlen(exstr_f.construct_ptr) + strlen(exstr_s.construct_ptr) + 1];
看你这句就可能要出问题了.

这里new了, 你在哪里delete呢?

如果你说在析构函数中, 那么崩溃是肯定的了.
因为你的ex是栈变量, 在+结束后, 这个类会被析构,也就是ex.construct_ptr已经是野指针了.
再返回的临时对象会拥有相同的指针, 但已经是野指针, 再使用就非法了.

建议好好读下CStringT类的源码学习下吧.

热点排行