gpt4 book ai didi

c++ - 唯一指针在移动后仍然持有对象

转载 作者:太空狗 更新时间:2023-10-29 23:32:31 26 4
gpt4 key购买 nike

我正在阅读一些关于智能指针如何在 C++ 中工作的教程,但我坚持使用我尝试的第一个:唯一指针。我遵循 wikipedia 中的指南, cppreferencecplusplus .我也看过 this answer已经。如果我理解正确的话,唯一指针应该是唯一拥有某个存储单元/ block 所有权的指针。这意味着只有唯一指针(应该)指向该单元格,没有其他指针。他们使用维基百科中的以下代码作为示例:

std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2 = p1; //Compile error.
std::unique_ptr<int> p3 = std::move(p1); //Transfers ownership. p3 now owns the memory and p1 is rendered invalid.

p3.reset(); //Deletes the memory.
p1.reset(); //Does nothing.

直到第二行,当我测试它时,它对我来说工作正常。然而,在将第一个唯一指针移动到第二个唯一指针之后,我发现这两个指针都可以访问同一个对象。我认为整个想法是让第一个指针变得无用可以这么说?我期待一个空指针或一些不确定的结果。我运行的代码:

class Figure {
public:
Figure() {}

void three() {
cout << "three" << endl;
}

};

class SubFig : public Figure {
public:
void printA() {
cout << "printed a" << endl;
}
};

int main()
{
unique_ptr<SubFig> testing (new SubFig());
testing->three();
unique_ptr<SubFig> testing2 = move(testing);
cout << "ok" << endl;
int t;
cin >> t; // used to halt execution so I can verify everything works up til here
testing->three(); // why is this not throwing a runtime error?
}

这里,testing 已经被移动到 testing2,所以我很惊讶地发现我仍然可以调用方法 three() 测试

此外,调用 reset() 似乎并没有像它所说的那样删除内存。当我将main方法修改为:

int main()
{
unique_ptr<SubFig> testing (new SubFig());
testing->three();
unique_ptr<SubFig> testing2 = move(testing);
cout << "ok" << endl;
int t;
cin >> t;
testing.reset(); // normally this should have no effect since the pointer should be invalid, but I added it anyway
testing2.reset();
testing2->three();
}

这里我希望 three() 不适用于 testing2,因为维基百科的示例提到内存应该通过重置来删除。我仍在打印打印一个,好像一切都很好。我觉得这很奇怪。

谁能给我解释一下原因:

  • 从一个唯一指针移动到另一个唯一指针不会使第一个指针无效?
  • 重置实际上并不删除内存?调用 reset() 时实际发生了什么?

最佳答案

本质上,您通过空指针调用成员函数:

int main()
{
SubFig* testing = nullptr;
testing->three();
}

...这是未定义的行为。

来自 20.8.1 类模板 unique_ptr (N4296)

4 Additionally, u can, upon request, transfer ownership to another unique pointer u2. Upon completion of such a transfer, the following postconditions hold:

  • u2.p is equal to the pre-transfer u.p,
  • u.p is equal to nullptr, and
  • if the pre-transfer u.d maintained state, such state has been transferred to u2.d.

(强调我的)

关于c++ - 唯一指针在移动后仍然持有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38027402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com