2016-12-15 12 views
-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;                                                  
} 
+3

あなた 'static_pointer_cast'は未定義の動作をしているC++しますもちろん、 'pB'は実際に' pD'型のオブジェクトを指していないからです。 –

+0

私は参照してください。私は明らかに 'std :: static_pointer_cast'の役割が誤解されています。 基本的な 'Base'を' Derived'に 'アップグレード'し、最後に 'std :: shared_ptr 'を生成することを私が望むものを達成することを提案しますか? –

+0

問題は、実際には 'Base'を構築していることです。そのため、' Derived'のメモリが実際には割り当てられていないので、アクセスしたときに未定義の動作が発生します。この場合、あなたはsegfaultを取得します。 – Donnie

答えて

0

これは、コンパイルした作品が、私はそれが '良い' であるかどうかわからないんだけど、11

#include<iostream>                                            
#include<memory>                                             

struct Base {};                                             

struct Derived : Base                                            
{                                                 
    Derived(std::shared_ptr<Base> b) : Base{*b} {}                                    
    std::weak_ptr<int> wp;                                          
};                                                

int main()                                              
{                                                 
    auto pB = std::make_shared<Base>();    // Create a pointer to Base class instance                         
    auto pD = std::make_shared<Derived>(pB);                                      
    auto pint = std::make_shared<int>(0);   // Define a pointer to an integer                           

    std::cout << "assigning pint" << std::endl;                                     
    pD->wp = pint;                                            
    std::cout << "Did not segfault" << std::endl;                                     

    return 0;                                              
}   
+0

はい、合法です。しかし、非常に不明です。データを移動したい場合、そのコードは解決しません(コピーが作成されます)。 –

関連する問題