Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未分配要释放的指针(创建类的动态副本)_C++_Xcode7 - Fatal编程技术网

C++ 未分配要释放的指针(创建类的动态副本)

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

我需要编写一个程序,在这个程序中,我必须创建一个包含元素的类,在这个类中,内存是动态分配的。当我动态创建类的两个实例(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);
};
类字符{
私人:
字符*数组;
公众:
//Конструкторы
查拉雷(){
数组=新字符[1];
}
CharArray(char*str){
数组=新字符[strlen(str)];
strcpy(数组,str);
}
CharArray(const CharArray&a){
数组=新字符[strlen(a.array)];
strcpy(数组,a.array);
}
//Деструктор
~CharArray(){
删除[]数组;

//cout
array=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;