微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++中的共享指针托管对象

如何解决C ++中的共享指针托管对象

问题在于共享指针如何通过以下代码处理对象:

std::vector<float> vec(10); 
float* p = &vec[0]; 
std::shared_ptr<float> p_shared(p); 

问题是共享指针p_shared是否仍负责管理vec,即删除/垃圾回收vec?在p_shared删除vec之前,是否有可能删除了vec?

解决方法

您发布的代码将导致未定义的行为,因为向量和shared_ptr都认为它们拥有内存。实际上,只有向量拥有它,因此,只要shared_ptr超出范围,它就会delete p(即UB),您的程序可以做任何事情,包括崩溃。

,

如果程序离开作用域,vec变量将被删除,共享指针也将被删除。结果,程序将由于双free()而崩溃。

但是,如果共享指针返回到另一个作用域,我们仍然可以使用该指针,直到共享指针意识到不再使用该指针为止,请参见以下示例:

std::shared_ptr<float> test()
{
    std::vector<float> vec(10);
    vec[0] = 10.1;
    vec[1] = 5.0;
    float* p = &vec[0]; 
    std::shared_ptr<float> p_shared(p); 
    cout<<"Get value 0th: "<<p_shared.get()[0]<<",1st: "<<p_shared.get()[1]<<endl;
    return p_shared;
}

int main()
{
    std::shared_ptr<float> p1 = test();
    p1.get()[1] = 9.0;
    std::cout<<"Get value 0th: "<<p1.get()[0]<<",1st: "<<p1.get()[1]<<std::endl;
    std::cout<<"End of program"<<std::endl;
}

输出:

Get value 0th: 10.1,1st: 5
Get value 0th: 0,1st: 9
End of program
free(): double free detected in tcache 2
Aborted (core dumped)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。