struct problem



  • [cpp]
    struct MenuItem
    {
    *char Caption; !!! Das wird auch ordentlich scheppern
    TEXT_ALIGN text_align;
    byte color;
    };
    [/cpp]

    Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption .



  • Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption.

    Er weist direkt ein zur Compilezeit bekanntes Stringliteral zu, da wird nichts scheppern und er darf sich gerne den Umweg über den Heap sparen. 😉



  • Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr

    Auch wenn das , wie die anderen sagen nicht stimmt (ich wieß es nicht) würde ich gerne wissen was man damit meint.Wann genau läuft die "Lebenszeit" ab und auch wie ?



  • newbie1337 schrieb:

    Wann genau läuft die "Lebenszeit" ab und auch wie ?

    // Automatisch (char-Array): Bis ans Ende der Funktion
    char array[] = "text";
    
    // Dynamisch: Bis zur expliziten Freigabe
    char* ptr = new char[5];
    std::strcpy(ptr, "text");
    delete[] ptr;
    
    // Statisch (Zeiger auf Stringliteral): Bis Programmende
    const char* ptr = "text";
    
    // Automatisch (std::string): Bis ans Ende der Funktion,
    // kann aber kopiert werden; Text bleibt somit gültig
    std::string str = "text";
    

    Nehmt statt der char -Array-Frickelei einfach std::string , es sei denn ihr habt einen guten Grund es nicht zu tun. Besser als "ich habe gehört std::string sei langsam"...



  • Ethon schrieb:

    Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption.

    Er weist direkt ein zur Compilezeit bekanntes Stringliteral zu, da wird nichts scheppern und er darf sich gerne den Umweg über den Heap sparen. 😉

    Das meinst du jetzt nicht ernst, oder? 😮



  • DocShoe schrieb:

    Ethon schrieb:

    Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption.

    Er weist direkt ein zur Compilezeit bekanntes Stringliteral zu, da wird nichts scheppern und er darf sich gerne den Umweg über den Heap sparen. 😉

    Das meinst du jetzt nicht ernst, oder? 😮

    Doch.

    Schau mal seinen Code an:

    m[1].Caption="Test";
    

    "Test" sitzt in .rdata und bleibt da auch bis zum Programmende, also passt das so.



  • Das war mir schon klar, das das in diesem Fall so ist. Aber eine Klasse undokumentiert so einzuschränken ist grob fahrlässig und ohne triftige Gründe wohl nicht zu rechtfertigen. Daher erstaunt mich dein Einwand etwas.



  • Vor allem sollte man, sofern man diese Einschränkung für gerechtfertigt hält, const char* statt char* nehmen.



  • Auch wenn ich eure Konversation nicht stören möchte , würde ich nun gerne wissen was nun was sein soll und bo nun string oder char oder const char einzusetzen sind



  • Normalerweise und speziell für dynamische Zeichenketten nimmst du std::string . Für Stringliterale kannst du auch const char* nehmen.

    Zu char* mit manueller Speicherverwaltung besteht in C++ unter normalen Umständen kein Anlass.



  • Also so wie es aussieht in dem fall ist eine Zeichenkette angebracht.



  • newbie1337 schrieb:

    Also so wie es aussieht in dem fall ist eine Zeichenkette angebracht.

    Eine weise Erkenntnis, doch was für eine Zeichenkette?



  • string ?



  • string!


Anmelden zum Antworten