使用复制构造函数和运算符重载 - 'pointer being freed was not allocated'

Using copy constructor and operator overload - 'pointer being freed was not allocated'

我已经创建了一个名为 MyInteger 的 class,我正在尝试创建一个复制构造函数,它将正确地制作一个单独的内存副本 pInteger 指向,并使新对象中的 pInteger 指向它。我需要重载 = 运算符,以便所涉及的两个对象中的每一个都有其自己的 pInteger 指向的内存的单独副本。

MyInteger规格:

class MyInteger {
public:
    MyInteger(int);
    MyInteger(MyInteger &);
    ~MyInteger();
    int getMyInt();
    void setMyInt(int);
    MyInteger operator=(MyInteger&);

private:
    int * pInteger;

}; 

MyInteger 实施:

MyInteger::MyInteger(int i) {
    pInteger = new int;
    *pInteger = i;
}


MyInteger::MyInteger(MyInteger &obj) {
    pInteger = new int;
    pInteger = obj.pInteger;
}

MyInteger MyInteger::operator=(MyInteger &i) {
    pInteger = new int;
    pInteger = i.pInteger;

    return i;
}


MyInteger::~MyInteger() {
    delete pInteger;
}

int MyInteger::getMyInt() {
    return *pInteger;
}

void MyInteger::setMyInt(int i) {
    pInteger = new int;
    *pInteger = i;
}

我很确定问题至少部分是由于我在构造函数和运算符重载中重新分配 pIntegerpInteger = new int;,然后是 pInteger = obj.pInteger;。我认为第二个作业是使用 new 使第一个作业无效,所以我得到

pointer being freed was not allocated

因为 pInteger 没有被正确地动态分配。我在这里朝着正确的方向前进吗?我不确定如何解决这个问题,任何帮助都会很棒。

MyInteger::MyInteger(MyInteger &obj) {
    pInteger = new int;
    pInteger = obj.pInteger;
}

MyInteger MyInteger::operator=(MyInteger &i) {
    pInteger = new int;
    pInteger = i.pInteger;

    return i;
}

您分配 pInteger 正确的值 -- 指向一个新分配的整数。然后你立即用错误的值覆盖它——一个指向另一个对象拥有的整数的指针。

此外,您的 operator= returns 一份。您希望 (j = i)++; 修改 j,而不是临时修改。