未分配被释放的指针(创建类的动态副本)
pointer being freed was not allocated (creating dynamic copy of the 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 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);
};
下面是我的main:
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;
}
如何解决这个问题?
main中的语句:
m2=m1;
由于m2
和m1
是指针,它将把m1
中的地址分配给m2
。
这没有错,但是当你:
delete m1;
delete m2;
第一条语句将销毁内存,第二条语句将尝试销毁相同的内存(因为指针是相同的)。
有一个关于所有权的问题:当m1
释放它的所有权时,你应该将它设置为null (m1 = nullptr
)。
这就是为什么你的代码会产生这个错误。无论如何,在你的代码中还有其他错误的内存(正如你可以在其他答案或评论中看到的)。
array=new char[strlen(str)];
是错误的;你需要array=new char[strlen(str) + 1];
同样适用于array=new char[strlen(a.array)];
变量m1
和m2
不属于CharArray
类型;指向 CharArray
的指针类型为;因此,当你执行m2=m1
时;(嗯,Biagio已经回答了这个问题,所以我不干了。)
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 用callgrind追踪不必要的副本
- 阻止用户创建班级对象的副本,但允许动态的对象有什么好处
- 当分配动态内存以存储字符串副本时,程序会中断
- 将动态数组作为副本传递给递归函数 C++
- 如何在使用旧版本gcc的系统上动态链接到libc.so.6、libstdc++.so.6的本地副本
- 如何在 C++ 函数内创建数组的动态副本
- 由指针指向的类副本的c++动态分配
- 未分配被释放的指针(创建类的动态副本)