我试图理解为什么在'='重载中我必须检查自我分配。我想我知道答案,这是因为循环不断,但我不明白为什么循环开始了。 >
示例:
Point p1(3,5);
p1 = p1 ;
答案 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)
没有循环。当您拥有一些分配的内存之类的资源时,会发生什么情况。
如果某些数据上有共享指针。在分配过程中,您要做的第一件事是取消分配本地数据。然后,将其替换为来自另一个对象的数据。如果它们相同,那么您将失去资源。
然后的解决方案是检查自我分配。