C++ 未分配要释放的指针(创建类的动态副本)
我需要编写一个程序,在这个程序中,我必须创建一个包含元素的类,在这个类中,内存是动态分配的。当我动态创建类的两个实例(m1和m2)并复制m1(代码:m1=m2)时,编译器会说下一个:C++ 未分配要释放的指针(创建类的动态副本),c++,xcode7,C++,Xcode7,我需要编写一个程序,在这个程序中,我必须创建一个包含元素的类,在这个类中,内存是动态分配的。当我动态创建类的两个实例(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 Pro
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);
};
类字符{
私人:
字符*数组;
公众:
//Конструкторы
查拉雷(){
数组=新字符[1];
}
CharArray(char*str){
数组=新字符[strlen(str)];
strcpy(数组,str);
}
CharArray(const CharArray&a){
数组=新字符[strlen(a.array)];
strcpy(数组,a.array);
}
//Деструктор
~CharArray(){
删除[]数组;
//coutarray=newchar[strlen(str)];
错误;您需要array=newchar[strlen(str)+1];
同样适用于array=newchar[strlen(a.array)];
变量m1
和m2
不是CharArray
类型;它们是指向CharArray
的指针类型;因此,当您执行m2=m1
时(好吧,比亚吉奥已经回答了这个问题,所以我退出了)。您的主要声明:
m2=m1;
由于m2
和m1
是指针,它将m1
中的地址分配到m2
中
这没有错,但当你:
delete m1;
delete m2;
第一条语句将销毁内存,第二条语句将尝试销毁相同的内存(因为指针是相同的)
所有权存在问题:当m1
释放其所有权时,您应该将其设置为null(m1=nullptr
)
这就是代码产生错误的原因。无论如何,代码中的内存还有其他错误(如您在其他答案或注释中所看到的)。在构造函数中使用std::vector
或std::string
时,您没有分配足够的:array=new char[strlen(str)+1]应使用
而不是array=new char[strlen(str)]
在strcpy
之前。为什么要动态分配在其构造函数中动态分配数组的对象?至少你可以避免new
和delete
一个好的经验法则是:new
和delete
语句的数量应该匹配。(2次new
->2次delete
,等等)你最好阅读智能指针、标准容器(如vector)因此,我如何创建一个类的对象的动态副本和销毁对象及其副本?<代码> M2=M1< /Cord>将复制指针。<代码> *M2=*M1< /C++ >将复制指向的对象。注意<代码> M2<代码>和代码> M1<代码>必须被正确初始化,并且应该定义一个适当的<代码>操作符=
适合您的班级。
delete m1;
delete m2;