Ist ein CArray aus structs, welches ein union hat, bedenklich



  • Hallo,

    ist folgender Code falsch:

    struct Foo
    {
      BOOL is_foo;
      union
      {
        struct // if (is_foo)
        {
          int foo_id;
          CString foo_lbl;
        };
        struct // if (!is_foo)
        {
          int bar_id;
          CString bar_lbl;
        };
      };
    };
    
    CArray<Blubb, Blubb> arr; // liegt auf dem stack
    

    So bekomme ich einen Zugriffsfehler, wenn arr zersört wird.

    So passiert es nicht:

    struct Foo
    {
      BOOL is_foo;
      int foo_id;
      CString foo_lbl;
      int bar_id;
      CString bar_lbl;
    };
    
    CArray<Blubb, Blubb> arr; // liegt auf dem stack
    

    Durch das erste Beispiel möchte ich halt in der Struktur Foo Platz sparen. Aber es kommt zu dem genannten Zugriffsfehler. Kennt jemand das Problem? Ist esgrundsätzlich falsch ein CArray aus einer solchen Struktur mit union zu verwenden? Danke im Voraus.



  • Ich denke das wissen die Leute aus dem C++ Unterforum besser.



  • Warum machst nicht einfach ne Struktur die einfach "id" und "lbl" enthält.



  • ............. schrieb:

    Ich denke das wissen die Leute aus dem C++ Unterforum besser.

    stimmt zwar, heißt aber nicht, dass wir das hier nicht wissen^^

    Dein Prob wird sein, dass das CString-Objekt 2 mal freigegeben wird. Unions mit Objekten sind meist auch nicht so wirklich sinnvoll.



  • Ich glaube, das Problem ist eher die Kombination aus union und C++-Klasse - der Compiler weiß einfach nicht, ob er beim Zerstören deiner Konstruktion den Destruktor von foo_lbl oder bar_lbl aufrufen soll (im zweiten Quelltext verwendet er beide).



  • @Pellaeon:

    Das ist nur gekürzter Pseude-Code. Im richtigen Code haben die structs des unions eine unterschiedliche Anzahl an membern.

    Aber ich glaube ich weiss jetzt woran es liegt. Und zwar am CString. Wenn ich CHAR* benutze passiert es nämlich auch nicht. Denn normaleweise beschwert sich ja der Compiler, wenn mam folgendes macht:

    union Bla 
    {
      CString str;
      int i;
    };
    

    Der Fehler lautet dann, dass ein union-member keinen Kopierkonstruktor haben darf.
    Deswegen denke ich, dass mein Versuch eine üble Umgehung dieses Compilerfehlers ist.



  • Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Was soll jemand im C++-Forum über CString und CArray wissen. 😕



  • @CStoll:

    damit bestätigt sich meine Vermutung. Danke.

    Jetzt denke ich auch, dass dieser Beitrag eher ins C++-Forum gehört, denn mit std::vector und std::string passiert das gleiche.



  • Redhead schrieb:

    Was soll jemand im C++-Forum über CString und CArray wissen. 😕

    Wo die Klassen herkommen ist doch egal, das Kernproblem geht um Unions



  • rat_suchender schrieb:

    Hallo,

    ist folgender Code falsch:

    struct Foo
    {
      BOOL is_foo;
      union
      {
        struct // if (is_foo)
        {
          int foo_id;
          CString foo_lbl;
        };
        struct // if (!is_foo)
        {
          int bar_id;
          CString bar_lbl;
        };
      };
    };
    
    CArray<Blubb, Blubb> arr; // liegt auf dem stack
    

    Ja, ist er.

    Nested Classes in einer anonymen Union sind nicht erlaubt (Standard: 9.5 Cl. 2).

    Und dann noch das eigentliche (9.5 Cl. 1)
    An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects.

    Nontrivial bedeutet dabei: selbst implementiert (und damit nicht compiler-generiert) - oder eines in der Klasse enthaltenen Objekte hat einen nicht-trivialen XXX (alle 4 Varianten einsetzen).



  • Pellaeon schrieb:

    Redhead schrieb:

    Was soll jemand im C++-Forum über CString und CArray wissen. 😕

    Wo die Klassen herkommen ist doch egal, das Kernproblem geht um Unions

    So sehe ich das auch. 🙂


Anmelden zum Antworten