|
发表于 2023-10-22 17:24:32
|
显示全部楼层
这段代码中的问题在于它的拷贝构造函数和拷贝赋值运算符的实现。当你创建obj2并将其初始化为obj1时,拷贝构造函数会被调用。在你的拷贝构造函数中,你调用了拷贝赋值运算符,这会导致obj1的ptr被删除,然后分配新的内存并复制rhs.ptr的值。然而,这并没有创建一个新的int,而是复制了rhs.ptr的值。这意味着obj1和obj2的ptr现在指向同一个int。
然后,当obj1和obj2离开作用域并被销毁时,它们的析构函数都会尝试删除同一个int,这就是你遇到的内存错误的原因。
为了解决这个问题,你需要在拷贝构造函数和拷贝赋值运算符中分配新的内存,并复制rhs.ptr指向的值,而不是rhs.ptr本身。这样,每个对象都会有自己的int,并在对象被销毁时删除它。
以下是修正后的代码:
- #include <iostream>
- #include <string>
- using namespace std;
- class MyClass
- {
- public:
- MyClass(int *p);
- ~MyClass();
- MyClass(const MyClass &rhs);
- MyClass &operator = (const MyClass &rhs); //重载赋值符
- void print();
- private:
- int *ptr;
- };
- MyClass::MyClass(int *p)
- {
- ptr = new int(*p);
- }
- MyClass::MyClass(const MyClass &rhs)
- {
- ptr = new int(*rhs.ptr);
- }
- MyClass::~MyClass()
- {
- delete ptr;
- }
- MyClass &MyClass::operator = (const MyClass &rhs)
- {
- if(this != &rhs)
- {
- delete ptr;
- ptr = new int(*rhs.ptr);
- }
- else
- {
- cout << "赋值号两边为同个对象,不做处理!\
- ";
- }
-
- return *this;
- }
- void MyClass::print()
- {
- cout << *ptr << endl;
- }
- int main()
- {
- MyClass obj1(new int(1));
- MyClass obj2=obj1;
- obj1.print();
- obj2.print();
- return 0;
- }
复制代码
这样,每个MyClass对象都有自己的int,并且在对象被销毁时,它们各自的int也会被删除,从而避免了内存错误。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案 |
|