-1
std::shared_ptr
をダウンキャストしようとすると、派生クラスにstd::weak_ptr
が含まれているstd::static_pointer_cast
を使用してセグメンテーションが発生しました。ここでweak_ptrを含む派生クラスにshared_ptrをダウンキャストしました。C++ 11
はMWEです:
#include<iostream>
#include<memory>
struct Base {};
struct Derived : Base
{
std::weak_ptr<int> wp;
};
int main()
{
auto pB = std::make_shared<Base>(); // Create a pointer to Base class instance
auto pD = std::static_pointer_cast<Derived>(pB); // Downcast this to a Derived class instance
auto pint = std::make_shared<int>(0); // Define a pointer to an integer
std::cout << "assigning pint" << std::endl;
pD->wp = pint; //Attempt to assign member of Derived
std::cout << "Did not segfault" << std::endl;
return 0;
}
あなた 'static_pointer_cast'は未定義の動作をしているC++しますもちろん、 'pB'は実際に' pD'型のオブジェクトを指していないからです。 –
私は参照してください。私は明らかに 'std :: static_pointer_cast'の役割が誤解されています。 基本的な 'Base'を' Derived'に 'アップグレード'し、最後に 'std :: shared_ptr'を生成することを私が望むものを達成することを提案しますか? –
問題は、実際には 'Base'を構築していることです。そのため、' Derived'のメモリが実際には割り当てられていないので、アクセスしたときに未定義の動作が発生します。この場合、あなたはsegfaultを取得します。 – Donnie