user6702025 user6702025 - 3 months ago 19
C++ Question

C++ Corrupted Heap

My program seems to throw a rune-time exception about a corrupted heap when the main method returns. I have taken the proper precautions to not have this happen, including a copy constructor. Could anyone shed some light on why this is happening?

MyString.cpp

#include "MyString.h"
#include <cstdio>
#include <Windows.h>

MyString::MyString() {
str = (char*)malloc(sizeof(char));
*str = '\0';
}

MyString::MyString(char* src) {
int size = sizeof(char)*(strlen(src) + 1);
str = (char*)malloc(size);
strcpy_s(str, size, src);
}


MyString MyString::operator+(char* add) {
int addSize = sizeof(char)*strlen(add);
int fullSize = sizeof(char)*(strlen(str) + 1) + addSize;
str = (char*)realloc(str, fullSize);
char* temp = str;
temp += strlen(str);
strcpy_s(temp, addSize + 1, add);
return *this;
}

MyString::~MyString() {
if (str)
free(str);
}

MyString::MyString(const MyString &arg) {
int size = sizeof(char) * (strlen(arg.str) + 1);
str = (char*)malloc(size);
strcpy_s(str, size, arg.str);
}


main.cpp

#include <iostream>
#include "MyString.h"
using namespace std;


int main(int argc, char *argv[]) {
MyString test = MyString("hello!");
test = test + " world";
cout << test.toString() << endl;
cout << strlen(test.toString()) << endl;
system("pause");
return 0; //runtime error here
}

Answer

I'm fixing my post according to @user4581301 suggestion:

You sholud modify your addition operator overload so it spawns a new object and also implement assigment operator overload like this:

MyString operator+(char* add) const {
    int thisSize = sizeof(char)*strlen(str);
    int addSize = sizeof(char)*(strlen(add) + 1);
    int fullSize = thisSize + addSize;

    char* tempStr = (char*)malloc(fullSize);
    strcpy_s(tempStr, fullSize, str);
    strcpy_s(tempStr + thisSize, fullSize, add);

    return MyString(tempStr);
}

MyString& operator=(const MyString& assign){

    int assignSize = sizeof(char)*(strlen(assign.str) + 1);

    str = (char*)realloc(str, assignSize);

    strcpy_s(str, assignSize, assign.str);

    return *this;
}
Comments