成员分配超载导致堆损坏?

时间:2018-11-07 23:34:11

标签: c++ heap-corruption

(清晰度更新)

已经在这个问题上苦苦挣扎了一段时间,希望对此有所了解。我为创建的类重载了additionassignment运算符。 assignment运算符似乎返回正常,但是接下来的行退出并显示此错误:

  

检测到堆损坏:在正常块(#160)之后的0x012CA7D0处。显像管   检测到堆结束后应用程序已写入内存   缓冲。

我对这两个运算符的代码如下:

HSString& HSString::operator =(const HSString& argStr) {

    if (this != &argStr) {
        delete[] str;
        end = argStr.end;
        cap = argStr.cap;

        if (end > 0) {
            str = new char[end];
            for (int i = 0; i <= end; i++) {
                str[i] = argStr.str[i];
            }
       }
    }
    return *this;
}

//默认构造函数

HSString::HSString() {

    cap = 20;

    end = 0;

    str = '\0';

    createdCount++;

    currentCount++;
}

//析构函数

HSString::~HSString() {

    delete[] str;

    currentCount--;
}

//复制构造器

HSString::HSString(const HSString& argStr) {

    cap = argStr.cap;

    end = argStr.end;

    if (end > 0) {
        str = new char[end];

        for (int i = 0; i <= end; i++) {
            str[i] = argStr.str[i];
        }

    } else {
        str = nullptr;
    }

    createdCount++;

    currentCount++;
}


const HSString HSString::operator +(const HSString& strOne)const {

    HSString temp;

    temp.end = end + strOne.end;
    temp.cap = cap + strOne.cap;

    temp.str = new char[cap];

    for (int i = 0; i < end; i++) {
        temp.str[i] = str[i];
    }

    for (int i = 0; i <= strOne.end; i++) {
        temp.str[i + end] = strOne.str[i];
    }

    return temp;
}

在向成员分配运算符返回深层副本之后,将执行错误。

我在字符串的末尾走了一段,以包含空终止符来清理动态创建的内存中的多余垃圾值。

使用三个概念的规则。

//示例:

int main() {

HSString greeting("Hello");
HSString name("Hayden");
HSString result;

vvvvvv //此语句执行后立即发生堆损坏vvvvvvv

result = greeting + name;


cout << result;





system("pause");
return 0;
}

1 个答案:

答案 0 :(得分:1)

for (int i = 0; i <= end; i++)

这会产生溢出。因为在C ++数组中,如果声明一个包含5个元素的数组,则索引从0开始,索引范围是0到4。因此,如果创建大小为end的数组,则索引的范围是0到结尾-1。您需要检查i < end

编辑: 尽管我不知道for (int i = 0; i <= strOne.end; i++)

的实现,但这也适用于HSString