c++ - 破坏自动隐式对象

标签 c++ class implementation

让我们假设以下场景。我有一个隐式共享类,定义如下:

class MyClass
{
public:
    MyClass (void) {
        data = new Data();
        data->refs = 1;
        data->dummy = 32;
    }

    ~MyClass (void) {
        if (--data->refs == 0)
            delete data;
    }

    MyClass (const MyClass& c) {
        ++(data = c.data)->refs;
    }

    MyClass& operator = (const MyClass& c) {
        ++(data = c.data)->refs;
        return *this;
    }

private:
    struct Data {
        int refs;
        int dummy;
    } *data;
};

这个想法是,当这个类被复制时,指向数据的内部指针被复制,并且对该数据的引用数量增加。但是,请考虑以下事项:

int main (void)
{
    MyClass c1;
    c1 = MyClass();
    c1 = MyClass();
    return 0;
}

我的理解是 MyClass 有三个实例,只有最后一个实例被释放。如果是这种情况,我该怎么做才能避免这些情况并确保清理 MyClass 的每个实例?

最佳答案

在您的赋值运算符中,您需要确保在用新值覆盖其值之前清除分配给对象的值。毕竟,赋值的左边已经引用了一个值。编写赋值运算符的最简单方法是利用现有的复制构造函数和析构函数并使用函数 swap()交换两个对象:

MyClass& MyClass::operator = (MyClass c) {
    this->swap(c);
    return *this;
}

void MyClass::swap(MyClass& other) {
    std::swap(this->data, other.data);
}

这样,值已经被复制到值 c 中了当前值与c持有的值交换.当c被销毁引用计数根据需要减少。

请注意,std::share_ptr<T>已经使用一种相当奇特的机制进行引用计数:您可能希望使用标准类而不是自己滚动。

关于c++ - 破坏自动隐式对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18796851/

相关文章:

c++ - C/C++检测网络类型

c++ - 如何读取 <string,vector<pair<int, string>>> 的映射

C++单例实现,双重检查锁定

java - 类的实现和参数

c++ - Magick++ 使用 CGI 显示图像

c++ - 读取和写入 C++ vector 到文件

Excel VBA 将数据写入类模块中的字典

ruby - 单例类的出现

android - Android(Kotlin)-无法访问其他类的 View

java - 如何使用java中的列表结构确定java中当前元素之后是否存在另一个元素