使用复制构造函数和运算符重载 - "未分配正在释放的指针"

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

本文关键字:分配 释放 指针 复制 构造函数 重载 运算符      更新时间:2023-10-16

>我创建了一个名为 MyInteger 的类,我正在尝试创建一个复制构造函数,该构造函数将正确创建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 使第一个作业无效,所以我得到

未分配正在释放的指针

因为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=会返回一份副本。你会期望(j = i)++;修改j,而不是临时的。