2016-10-01 73 views
1

我需要編寫一個程序,其中,I必須與元素,其中存儲器是動態分配創建類。當我動態地創建我的課(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

在你的構造函數,你沒有分配足夠的:'陣列=新的char [(STR)+1的strlen]'應被使用,而不是' 'strcpy'之前的數組=新字符[strlen(str)]'。 – Franck

+1

爲什麼你動態地分配在其構造函數中動態分配數組的對象?至少你的主要你可以保留'新'和'刪除' – user463035818

回答

1

聲明在主:

m2=m1; 

因爲m2m1是指針,它會在m1地址分配到m2

這是沒有錯的,但是當你:

delete m1; 
delete m2; 

第一條語句會破壞內存,第二個聲明將試圖摧毀相同的內存(因爲你的指針是一樣的)。

所有權有問題:當m1釋放所有權時,應將其設置爲空(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)];

變量m1m2CharArray類型;它們是類型的指針CharArray;因此,當你做m2=m1; (當然,比亞已經回答了這一點,所以我辭職了。)

相關問題