this Zeiger auf temporäres Object



  • Guten Tag!

    Ich habe folgenden Code:

    struct Group {
        std::vector<Mark> marks;
    
        Group(int num) {
             for( diverse regeln ...) 
                 marks.push_back( Mark(this) );
        }
    };
    
    struct Mark {
       Group* parentGroup;
       ...
       Mark(Group* parentGroup) : parentGroup(parentGroup) { ... }
    };
    
    std::map<std::string, Group> groups;
    

    Ich habe also eine Group, die Marks speichert. Jede Mark hat einen Zeiger auf ihre parent Group. Außerdem habe ich jetzt noch eine map von string auf Group.
    Das Problem ist nun hier:

    for( diverse regeln...)
       groups.insert( make_pair(id, Group(num))) );
    

    Hier wird die groups Map befüllt mit Group Objekten. Das Problem: Ich übergebe an insert() ja temporäre Group Objekte, das heißt der this Zeiger im Group Ctor zeigt auf ein temp Objekt und nach der Look habe ich quasi Dangling Pointer in den Mark (wenn ich das richtig sehe!)

    Wie kann ich das lösen? Also dass jede Mark auf eine valide Group zeigt.



  • Bevorzugt:
    So wie es dort steht bräuchte Group einen Copy-Konstruktor und einen Copy-Assignment-Operator in welchen die Marks korrekt kopiert werden, so dass sie auf die tatsächliche Parent-Group verweisen.

    Alternativ:
    Falls es nicht gewünscht ist, dass Gruppen kopiert werden können, kann man diese (vom Compiler generierten) Methoden auch explizit löschen ( ... = delete; ) und entweder:
    - Die ID/Group-Paare mittels emplace() einfügen oder

    • unique_ptr oder shared_ptr für die map-values verwenden.

    Gruss,
    Finnegan



  • Danke für die schnelle Antwort! 🙂 👍

    Habe einen CopyCtor geschrieben und jetzt klappt alles!


Log in to reply