gpt4 book ai didi

c++11 - 在将变量的值移动到另一个变量后如何防止使用该变量?

转载 作者:行者123 更新时间:2023-12-03 03:07:02 29 4
gpt4 key购买 nike

通过在 C++ 中引入 std::move,您可以摆脱不必要的副本。问题是,虽然您可以将值移出变量,但无法阻止函数的其余部分仍然引用该变量。

例如,假设我调用一个返回大向量的函数,然后(在更多代码之后)我想将该向量移动到另一个变量中,如下所示:

auto lotsOfBooks = getAllBooks();
if (lotsOfBooks.empty())
return;
...
auto library = Library("National Library", std::move(lotsOfBooks));

将书籍容器移至图书馆后,我不希望其余代码引用 lotsOfBooks变量不再。但我没有找到阻止这种情况发生的方法。

我知道,在很多情况下,您可以简单地将函数的一部分放在它自己的嵌套 block 中(将它们放在花括号中),但这并不总是可行。在这种情况下,可以使用 std::unique_ptr<Library> 来规避该问题。而不是Library ,但内存分配并不总是需要的。

有没有办法阻止在特定语句/行之后使用变量(使用编译器构造、C++ 构造、代码检查工具(如 Lint)等)?

最佳答案

你永远无法阻止程序员在代码中的某个地方写下错误的句子。你可以(在编译器的帮助下)是:

  • 尝试检测最常见的错误
  • 尽最大努力在运行时尽可能快地检测到此类错误(至少在非优化模式的调试中)

这就是 C++11 中的 move 所发生的情况。原始指针被设置为空,或者原始容器被清空。它给出了 2 个很好的结果:

  • 析构函数不能破坏任何东西(删除空指针是无害的,销毁空容器也是无害的)
  • 对旧变量的任何访问都应立即引发异常:空指针访问/赋值、向量索引超出范围等。

关于c++11 - 在将变量的值移动到另一个变量后如何防止使用该变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31675405/

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