【问题标题】:unique_ptr is going out of scope within a structunique_ptr 超出结构范围内
【发布时间】:2016-11-29 04:01:43
【问题描述】:

我的代码是这个,在一个名为 uniqueptr_scope.cpp 的文件中

#include<iostream>
#include<memory>
#include<vector>

struct un{
    int i;
};

struct un2{
    int i;

    void testTheUN(){
        temp->i=1000;
    }

    void main2(){
        un u;
        temp = std::unique_ptr<un>(&u);
        std::cout<<temp->i<<"\n";
        testTheUN();

    }
    private:
        std::unique_ptr<un> temp;
};


int main(){


    un2 u;
    u.main2();


}

我用这个编译 g++ -std=c++1y uniqueptr_scope.cpp

回答我的问题: 我想检查类或结构中唯一指针的范围。但是当我运行代码时,我得到的输出是

-650998192
*** Error in `./a.out': free(): invalid pointer: 0x00007fffd9328e40 ***
Aborted (core dumped)

所以在un2::main2() 函数中,temp 被初始化并被分配了一些值。然后,当我调用testTheUN() 时,unique_ptr 超出了范围。由于我创建了一个类级别 unique_ptr ,默认情况下范围应该是类的。

假设unique_ptr 的作用域是main2(),即使main2 还没有完全退出,因此不应该调用unique_ptr 的析构函数! 这就是我的困惑!

注意:使用 g++ 4.8 编译器(在 Ubuntu 存储库中是最新的)所以必须给出“c++1y”标准

【问题讨论】:

    标签: c++ c++14 unique-ptr


    【解决方案1】:

    行后

    un u;
    temp = std::unique_ptr<un>(&u);
    

    temp 是一个指向&amp;uunique_ptr。函数返回后,temp下的指针为悬空指针。

    使用

    un u;
    temp = std::make_unique<un>(u);
    

    改为。

    【讨论】:

    • @O'Neil,如果 OP 不想复制 u 的值,这将起作用。
    • 我仍然没有像在堆栈中那样,main2 调用 testTheUn(),temp 仍然会实时引用 u
    • @srinath29,当您从main 返回时会出现问题。当时,u.temp 包含一个悬空指针。
    • 但是从main2返回后,我没有将temp用于任何其他目的。所以它不会尝试读取之前指出的内存位置
    • @srinath29,unique_ptr 的析构函数会尝试释放底层指针指向的内存。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2021-10-04
    • 2014-06-18
    • 1970-01-01
    • 2016-02-10
    • 2023-03-27
    • 2023-04-06
    • 2016-04-13
    相关资源
    最近更新 更多