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_castund 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.