了解在 C++ 析构函数中移动和访问资源的后果

Understanding the Consequences of Moving and Accessing Resources in C++ Destructors

提问人:james 提问时间:8/4/2023 最后编辑:prapinjames 更新时间:8/6/2023 访问量:35

问:

我有以下代码为我的问题提供上下文。当被调用时,会先被移动,导致被移动后被破坏。但是,我正在尝试在析构函数中使用。有人可以验证以下假设吗?谢谢!move_test()main()aa._stra._str

a._str现已移动并处于未定义状态,尝试访问它可能会导致问题。

#include <iostream>
#include <string>
struct A { 
    A(A&& other)
        : _str(std::move(other._str)) {
            std::cout<<"A move constructed"<<std::endl;
        }
    
    ~A() {
        // _str has been moved, but accessed here, undefined behaviour?
        _str = "destructor called";
        std::cout<<_str<<std::endl;
    }

    static A move_test() {
        A a("hey");
        return std::move(a);
    }
    std::string _str;
private:
    A(const std::string s) : _str(s) {}
};

int main() {
    A b = A::move_test();
    b._str = "longer string";
    std::cout<<b._str<<std::endl;
    return 0;
}
C++ C++11 析构函数

评论

0赞 Igor Tandetnik 8/5/2023
移出的对象处于不确定但有效的状态。它可以被销毁,并且可以调用不依赖于其当前状态的方法,例如赋值。你的例子很好。

答: 暂无答案