c++ - 我应该删除运算符赋值函数中的原点指针吗?

标签 c++ copy-constructor assignment-operator

我编写了以下演示代码来学习复制构造函数和赋值运算符。但是有一点困惑。我被告知删除赋值运算符中的指针并为 data 分配新地址。但是我只能让我的代码工作删除该行。我拍了this页面作为引用,但它只显示了 int 的示例,而没有显示 int*。我该如何解决这个问题?

#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <boost/smart_ptr.hpp>
#include <boost/make_shared.hpp>

using namespace boost;

class ClassOne
{
public:
    ClassOne():data(NULL) {}
    ClassOne(int data_param):data(NULL)
    {
        init(data_param);
        std::cout << "construct" << std::endl;
    }

    virtual ~ClassOne()
    {
        if (data) {
            delete data;
        }
        data = NULL;
    }

    ClassOne(const ClassOne& rhs){
        std::cout<< "copy " <<std::endl;
        data = NULL;
        init(*rhs.data);
    }

    ClassOne& operator = (const ClassOne& rhs){
        std::cout<< "assign " <<std::endl;
        int* p_old = rhs.data;
        data = new int(*p_old);
        //delete p_old;            // I have to delete this line to make my code work
        return *this;
    }

    void init(int data_param)
    {
        if (data) {
            delete data;
        }
        data = new int(data_param);
    }

private:
    int* data;
};

int main(int argc, const char * argv[]) {
    ClassOne c1(10);
    ClassOne c2(c1);       // call copy constructor
    ClassOne c3;
    c3 = c1;               // call assignment function
    return 0;
}

最佳答案

您正试图删除其他对象的 data 成员,而您打算删除自己的 (this) 对象的当前 data 成员反而。您可能想要的是:

ClassOne& operator = (const ClassOne& rhs){
    std::cout<< "assign " <<std::endl;
    delete data;               // delete your own old data
    data = new int(*rhs.data); // clone the rhs's data
    return *this;
}

关于c++ - 我应该删除运算符赋值函数中的原点指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34613399/

相关文章:

matlab - 复制子类对象的父类(super class)部分

c++ - 如何从喜欢的列表中制作复制构造函数

c++ - 重载赋值运算符是否总是由 C++ 编译器提供?

c++ - 检测基类分配给指向派生类的引用

c++ - 如何从另一个类中的私有(private)指针指向的类中获取私有(private)信息?

c++ - 如何获取n叉树中的元素

c++ - 简单的 libtool 替代品?

c++ - 无法禁用 std::string 的返回值优化?

c# - 不与 lambda 表达式一起使用时的 => 运算符是什么?

c++ - 为什么我的 operator== 不匹配