gpt4 book ai didi

c++ - shared_pointer 意外行为

转载 作者:行者123 更新时间:2023-11-28 01:46:20 26 4
gpt4 key购买 nike

有一段代码:

A.cpp

class MySomeClass: public SomeClass
{
public:
void specificMethod();
}

class A
{
public:
A::A();

std::shared_ptr< B > m_bObject;
std::shared_ptr< MySomeClass > m_argument;
}

A::A()
{
m_argument= std::make_shared< MySomeClass >();
m_bObject = std::make_shared< B >( m_argument);
}

B.cpp

B::B(const std::shared_ptr< SomeClass >& smartOne):m_smartOne(smartOne)
{}

B::someMethod()
{
m_smartOne->specificMethod();
}

B.h

class B
{
public:
B(const std::shared_ptr< SomeClass >& smarOne);
void someMethod();

private:
const std::shared_ptr< SomeClass >& m_smartOne;
};

问题是当我调用 m_bObject->someMethod() 时出现核心转储,因为 m_smartOne 不是 MySomeClass 而是 SomeClass.
为什么?是范围问题、所有权问题还是其他?
我收到了 B 类的代码,无法更改。

最佳答案

std::make_shared<B>(m_argument)构造 B对象,它将创建一个临时的 shared_ptr<SomeClass>来自 m_argument 的对象, 类型为 shared_ptr<MySomeClass> .对该临时文件的引用传递给 B的构造函数,它存储一个引用,当临时对象在构造函数调用完成后被销毁时,该引用立即变为悬空。

使用悬挂引用的结果当然是未定义的行为。任何事情都有可能发生。

如果你不能碰B , 那么你能做的最好的可能就是拥有 A存储 shared_ptr<SomeClass>成员,以便不创建临时文件。但即便如此A将有效地将引用存储到自身中,这意味着默认的复制/移动构造函数和赋值运算符都会做错误的事情。那是一大堆蠕虫。

关于c++ - shared_pointer 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44921131/

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