<bad ptr =“”>重载+运算符</bad>

时间:2011-03-27 19:19:27

标签: c++ overloading operator-keyword pointers

当我在这个构造函数中创建一个新的字符串数组时,调试器给我'坏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;
}

2 个答案:

答案 0 :(得分:3)

好吧,当这个方法返回时,“result”将被复制并且原始的被破坏。如果析构函数删除了数组,并且没有智能复制构造函数来确保新副本包含有效的新数组,那么您将遇到问题。

但你说编译器说了一个坏指针 - 在哪里?什么线?

答案 1 :(得分:1)

从你的代码片段开始,没有什么是错的,我的第六感觉告诉我你没有编写copy-constructor,并且正在使用编译器生成的默认值,或者stringArray可能不是以null结尾的字符串!

编辑:

在你的拷贝构造函数中,这是错误的:

stringArray = s.stringArray; //wrong!

改为使用strcpy

strcpy(stringArray, s.stringArray); //correct!

确保所有字符串都以空值终止!