2016-10-01 3 views
1

Мне нужно написать программу, в которой я должен создать класс с элементами, где память распределяется динамически. Когда я динамически создать два экземпляра моего класса (m1 и m2) и сделать копию m1 (код: m1 = m2), компилятор говорит следующее:Указатель, освобождаемый, не был выделен (создание динамической копии класса)

C++(11253,0x100084000) malloc: *** error for object 0x1002000b0: 
pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Program ended with exit code: 9 

Вот мой класс:

class CharArray { 
private: 
    char *array; 
public: 
//Конструкторы 
CharArray() { 
    array=new char[1]; 
} 
CharArray(char *str) { 
    array=new char[strlen(str)]; 
    strcpy(array, str); 
} 
CharArray(const CharArray &a) { 
    array=new char[strlen(a.array)]; 
    strcpy(array, a.array); 
} 

//Деструктор 
~CharArray() { 
    delete [] array; 
    //cout << "Сработал деструктор!" << endl; 
} 

//Остальные методы 
//Выводит на экран содержимое массива 
void ShowArray(); 
//Ввод данных в массив 
void EnterString(); 
//Вывод информации о массиве 
void InfoAboutArray(); 
int SayLength(); 
CharArray operator+(CharArray &secondArray) const; 
//CharArray& operator=(const CharArray &a); 
CharArray& operator=(const char *a); 
//Делаем большие буквы мальнькими и наоборот 
void UpperCaseToLowerAndLowerCaseToUpper(); 
//Делаем маленькие буквы большие 
void AllUpperCase(); 
//Делаем большие буквы маленькими 
void AllLowerCase(); 

//Перегрузка операторов new и delete 
void* operator new(size_t size); 
void operator delete(void *p); 

void* operator new[](size_t size); 
void operator delete[](void *p); 
}; 

Вот моя главная:

int main(int argc, const char * argv[]) { 
char m[16]="Hello, World!!!"; 
CharArray *m1; 
cout << "Динамическое создание экземпляра класса, его инициализация строкой \"Hello, World!!!\" и вывод содержимого экземпляра на экран:" << endl; 
m1=new CharArray(m); 
m1->ShowArray(); 
cout << "Создание динамической копии экземпляра класса" << endl; 
CharArray *m2; 
m2=m1; 
cout << "Вывод содержимого копии экземпляра на экран:" << endl; 
m2->ShowArray(); 
delete m1; 
delete m2; 
return 0; 
} 

Как решить эту проблему?

+1

использовать 'std :: vector' или' std :: string' – user463035818

+0

в ваших конструкторах, вы не выделяете достаточно: 'array = new char [strlen (str) +1]' следует использовать вместо ' array = new char [strlen (str)] 'перед' strcpy'. – Franck

+1

Почему вы динамически выделяете объекты, которые динамически выделяют массив в их конструкторе? По крайней мере, ваше главное, что вы можете сохранить 'new' и' delete' – user463035818

ответ

1

заявление в ваш главный:

m2=m1; 

так m2 и m1 являются указателями, он будет назначать адрес в m1 в m2.

Это не так, но когда вы:

delete m1; 
delete m2; 

Первый оператор уничтожит память, а второй оператор будет пытаться уничтожить ту же память (потому что вы указатели одинаковы).

Возникла проблема с владением: когда m1 освободите его владение, вы должны установить его в null (m1 = nullptr).

Именно поэтому ваш код производит эту ошибку. Во всяком случае, есть другие ошибки с памятью в вашем коде (как вы можете видеть в других ответах или комментариях).

+0

Итак, как я могу создать динамическую копию объекта моего класса и уничтожить объект и его копию? –

+0

'm2 = m1' будет копировать указатели. '* m2 = * m1' скопирует заостренный объект. Обратите внимание, что 'm2' и' m1' должны быть правильно инициализированы, и вы должны определить правильный 'operator =' для вас класс. –

+0

Спасибо) Все отлично работает –

0

array=new char[strlen(str)]; не правилен; вам нужно array=new char[strlen(str) + 1];

То же справедливо и для array=new char[strlen(a.array)];

переменных m1 и m2 не типа CharArray; они относятся к типу указатель кCharArray; поэтому, если сделаете m2=m1; (Ну, Бьяджо уже ответил, поэтому я ушел.)

Смежные вопросы