分配运算符重载和自我分配

时间:2018-10-11 12:30:32

标签: c++

我试图理解为什么在'='重载中我必须检查自我分配。我想我知道答案,这是因为循环不断,但我不明白为什么循环开始了。 >

示例:

Point p1(3,5);
p1 = p1 ;

2 个答案:

答案 0 :(得分:4)

这与无限递归无关,至少在通常情况下如此。自我分配的常见问题是,当您尝试在复制另一个对象的资源之前销毁自己拥有的资源时:如果该对象实际上是相同的,则该资源将丢失。

struct Object {
    std::unique_ptr<Resource> _resource;

    Object &operator = (Object const &other) {
        _resource = nullptr;                // Destroy "my" resource
        _resource = clone(other._resource); // Nothing to clone anymore...
    }
};

这个例子是人为的:没有人会先重置一个指针,然后然后分配它。但是这种模式在较早的C ++中突然出现,并且是“当心自我分配”建议的来源。

答案 1 :(得分:1)

没有循环。当您拥有一些分配的内存之类的资源时,会发生什么情况。

如果某些数据上有共享指针。在分配过程中,您要做的第一件事是取消分配本地数据。然后,将其替换为来自另一个对象的数据。如果它们相同,那么您将失去资源。

然后的解决方案是检查自我分配。