0

我正在构建自己的字符串类,但在子字符串方面遇到了一些问题

// Substring operator
// reutns a substring from a given point
String String::Substring(int startPosition, int length) const{
    if(length==0)
        length = GetLength()+1; //Takes care of null terminator, im not worried about if length is imputed yet
    char* result = new char[length-startPosition]; // Assume it's not negative for the sake of just getting it to work, It would only be negative if it's user error
    for(int i=startPosition; i<length; i++)
        result[i] = Text[i]; //Since it will always  go from a given point to the end, the null terminator will transfer in the for loop.

    return result;
}

Text 是字符串类的数据成员。我得到一个未处理的异常,访问冲突读取位置。

当我调试时,它正在经历这些过程

// Init-constructor for initializing this string with a C-string
String::String(const char* text){
    *this = text;
}

// Assigns C-string to this String
String& String::operator = (const char* text){
    // Delete the existing string first
    delete[] Text;

    // +1 accounts for null terminator
    int trueLength = GetLength(text)+1;

    // Allocate new memory
    Text = new char[trueLength];

    // Copy all characters from source into Text
    for ( int i = 0; i < trueLength; i++)
        Text[i] = text[i];

    return *this;
}

我无法弄清楚我做错了什么,感谢您的帮助。

4

2 回答 2

1

当您分配时,length-startPosition您很可能使用负数。

只用长度做新的:

char* result = new char[length];

编辑:

开始复制i=0并将最后一个复制字符之后的字节设置为空:

for(int i=0; i<length; i++)
    result[i] = Text[i+startPosition];

result[i] = '\0';
于 2012-11-29T21:23:49.700 回答
1

char*考虑使用构造函数创建 String 对象时会发生什么:

String::String(const char* text){
  *this = text;
}

尚未初始化任何成员,您调用operator=

String& String::operator = (const char* text){
  // Delete the existing string first
  delete[] Text;

你删除了 member Text,即使你还没有初始化它。删除未初始化的指针会产生未定义的行为。在这种情况下,该行为是一个例外。

Text在调用之前在构造函数中初始化为 null operator=,或者在构造函数中完成所有工作,而不是在赋值运算符中完成。

于 2012-11-29T21:26:29.473 回答