关于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类的源码学习下吧.