当我在这个构造函数中创建一个新的字符串数组时,调试器给我'坏ptr',但只有当我的重载操作符方法创建一个新的MyString对象时...才会混淆。
这是我的构造函数
MyString::MyString()
{
stringSize = 0;
stringCap = 16;
stringArray = new char[stringCap + 1];
stringArray[0] = '\0';
}
这是我的重载运算符方法
MyString operator+(const char* leftOp, const MyString& rightOp)
{
MyString result; // new object used to store result
result.stringSize = strlen(leftOp) + rightOp.stringSize;
// if the string does not fit in the array
if( result.stringSize > result.stringCap )
{
delete[] result.stringArray;
result.stringCap = ( result.stringSize + 15 ) & ~15;
result.stringArray = new char[result.stringCap + 1];
}
strcpy(result.stringArray, leftOp);
strcat(result.stringArray, rightOp.stringArray);
return result;
}
这是我的复制构造函数,调试器永远不会得到
MyString::MyString(const MyString& s)
{
stringSize = s.stringSize;
stringCap = s.stringCap;
//stringArray[stringCap + 1];
stringArray = new char[stringCap + 1];
stringArray = s.stringArray;
}
答案 0 :(得分:3)
好吧,当这个方法返回时,“result”将被复制并且原始的被破坏。如果析构函数删除了数组,并且没有智能复制构造函数来确保新副本包含有效的新数组,那么您将遇到问题。
但你说编译器说了一个坏指针 - 在哪里?什么线?
答案 1 :(得分:1)
从你的代码片段开始,没有什么是错的,我的第六感觉告诉我你没有编写copy-constructor,并且正在使用编译器生成的默认值,或者stringArray
可能不是以null结尾的字符串!
编辑:
在你的拷贝构造函数中,这是错误的:
stringArray = s.stringArray; //wrong!
改为使用strcpy
:
strcpy(stringArray, s.stringArray); //correct!
确保所有字符串都以空值终止!