shared_ptr<const T> in shared_ptr<T> konvertieren



  • Hallo Forum,

    ist es möglich, einen Zeigertyp std::tr1::shared_ptr<const T> in einen Zeigertyp ohne const ( std::tr1::shared_ptr<T> ) konvertieren?

    Mein Versuch:

    #include <memory>
    
    int main()
    {
        std::tr1::shared_ptr<const int> const_int_ptr(new int(34));
        std::tr1::shared_ptr<int>             int_ptr(const_cast<int*>(const_int_ptr.get()));
    }
    

    Laufzeitfehler (MSVC):

    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
    


  • OK habs gerade gefunden:

    #include <memory>
    
    int main()
    {
        std::tr1::shared_ptr<const int> const_int_ptr(new int(34));
        std::tr1::shared_ptr<int>             int_ptr(std::tr1::const_pointer_cast<int>(const_int_ptr));
    }
    


  • Du solltest dich aber fragen, warum dieser Cast nötig ist. const_cast und die Umgehung der Const-Correctness ist in den meisten Fällen ein Designfehler.

    Warum lässt du den ursprünglichen Zeiger überhaupt auf konstante Objekte zeigen, wenn du nachher trotzdem wieder schreibend auf diese zugreifen willst?



  • daersc schrieb:

    Mein Versuch:

    #include <memory>
    
    int main()
    {
        std::tr1::shared_ptr<const int> const_int_ptr(new int(34));
        std::tr1::shared_ptr<int>             int_ptr(const_cast<int*>(const_int_ptr.get()));
    }
    

    Laufzeitfehler (MSVC):

    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
    

    Nur, falls noch nicht klar ist, warum das nicht funktioniert: Der zweite shared_ptr erzeugt einen neuen referenzcounter. Die beiden shapred_ptr Instanzen wissen nichts voneinander und beide "denken" sie seien der einzige "Besitzer". Demtentsprechend gibt es "double deletion".

    Beachte: der shared_ptr-Konstruktor, der einen rohen Zeiger entgegen nimmt, erwartet, dass der Zeiger (falls ungleich null) auf ein neues Objekt zeigt, welches noch nicht unter Kontrolle steht.


Anmelden zum Antworten