Trying to learn C++ and I am having trouble finding the bug in my class.

It's a runtime error that the heap is being corrupted. So I assumed it had something to do with the MyString destructor being called twice on the same memory region. I made a copy constructor to solve the issue and it still doesn't seem to like me free()'ing my pointer.

MyString.h
Code:
#pragma once
extern class MyString {
	private:
		char *str;
	public:
		MyString();
		~MyString();
		MyString(char*);
		MyString(const MyString&);
		char* toString() {
			return str;
		}
		MyString operator+(char*);
};
MyString.cpp
Code:
#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
Code:
#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;
	system("pause");
	return 0;
}