Code: Select all
class MyClass{
public:
SubClass1 object1; //has pointers/smart-pointers to objects that have pointers to SubClass2
SubClass2* object2; //has pointers/smart-pointers to objects that have pointers/smart-pointers to SubClass1
MyClass(){ object2 = new SubClass2(&object1); }; //SubClass2 constructor establishes the relationship between object1 and object2 pointed-to-objects.
};
/*....*/
MyClass* ptr = new MyClass(std::move(MyClass()));
Meine Frage ist, gibt es bestimmte Checklisten, die ein Klassenobjekt enthält muss erfüllt sein, um Probleme beim Verschieben eines temporären Objekts auf ein neues Heap-zugewiesenes Objekt zu vermeiden?
Gibt es Möglichkeiten, im Voraus zu wissen, ob ein Verschiebungsvorgang von fehlschlägt?
Das ursprüngliche Problem war darauf zurückzuführen, dass falsch geschrieben wurde:
Code: Select all
std::shared_ptr ptr = std::make_shared(MyClass());
Beim Ausführen:
Code: Select all
std::shared_ptr ptr = std::make_shared();
Seltsamerweise gab es bei Folgendem keine Probleme:
Code: Select all
MyClass stack_obj{};
MyClass* ptr = new MyClass(std::move(stack_obj));
Das habe ich auch herausgefunden Wenn ich Objekt1 so geändert hätte, dass es stattdessen ein Zeiger von SubClass1 ist, hatte ich auch keine Probleme.
d. h.
Code: Select all
class MyClass{
public:
SubClass1* object1;
SubClass2* object2;
MyClass(){ object1 = new SubClass1(); object2 = new SubClass2(object1); };
};
/*....*/
MyClass* ptr = new MyClass(std::move(MyClass())); //worked fine
Zur Vervollständigung sind dies weitere Möglichkeiten, mit denen ich das gleiche Problem für die ursprüngliche Klasse replizieren konnte:
Code: Select all
template
std::shared_ptr make_shared_test(Args&& ... args)
{
return std::shared_ptr(new MyClass(std::forward(args)...));
}
MyClass&& forward_test(MyClass&& param){
return static_cast(param);
}
/*....*/
MyClass* obj1(new MyClass(std::move(MyClass())));
std::shared_ptr obj2 = make_shared_test(MyClass());
std::shared_ptr obj3 = std::shared_ptr(new MyClass(forward_test(MyClass())));
std::shared_ptr obj4 = std::shared_ptr(new MyClass(std::move(MyClass())));
std::shared_ptr obj5(new MyClass(std::move(MyClass())));