未分配被释放的指针(创建 class 的动态副本)
pointer being freed was not allocated (creating dynamic copy of the class)
我需要编写一个程序,我必须在其中创建 class 元素,其中内存是动态分配的。当我动态创建 class 的两个实例(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:
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;
}
如何解决这个问题?
array=new char[strlen(str)];
是错误的;你需要 array=new char[strlen(str) + 1];
同样适用于 array=new char[strlen(a.array)];
变量m1
和m2
不是CharArray
类型;它们的类型是 指向 CharArray
的指针;因此,当你做 m2=m1
; (嗯,Biagio 已经回答过了,所以我放弃了。)
你的主语句:
m2=m1;
由于m2
和m1
是指针,所以会将m1
中的地址赋值给m2
.
这没错,但是当你:
delete m1;
delete m2;
第一条语句会销毁内存,第二条语句会尝试销毁同一块内存(因为你们的指针是一样的)。
所有权存在问题:当m1
释放其所有权时,您应将其设置为空(m1 = nullptr
)。
这就是您的代码产生该错误的原因。无论如何,您的代码中的内存还有其他错误(正如您在其他答案或评论中看到的那样)。
我需要编写一个程序,我必须在其中创建 class 元素,其中内存是动态分配的。当我动态创建 class 的两个实例(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:
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;
}
如何解决这个问题?
array=new char[strlen(str)];
是错误的;你需要 array=new char[strlen(str) + 1];
同样适用于 array=new char[strlen(a.array)];
变量m1
和m2
不是CharArray
类型;它们的类型是 指向 CharArray
的指针;因此,当你做 m2=m1
; (嗯,Biagio 已经回答过了,所以我放弃了。)
你的主语句:
m2=m1;
由于m2
和m1
是指针,所以会将m1
中的地址赋值给m2
.
这没错,但是当你:
delete m1;
delete m2;
第一条语句会销毁内存,第二条语句会尝试销毁同一块内存(因为你们的指针是一样的)。
所有权存在问题:当m1
释放其所有权时,您应将其设置为空(m1 = nullptr
)。
这就是您的代码产生该错误的原因。无论如何,您的代码中的内存还有其他错误(正如您在其他答案或评论中看到的那样)。