Seite 1 von 1

[Gelöst] Lebenszeit von Variablen und Zeiger

Verfasst: 17. September 2014 16:03
von leif
Hallo alle miteinander!

Solange ich nun darauf gewartet habe, freigeschaltet zu werden, plagt mich schon ein gewisses Problem. Ich habe es eben nochmal versucht abstrakt aus meinem Projekt heraus zu arbeiten, so dass es hoffentlich noch verständlich und auch reproduzierbar ist. Schauen wir uns also den Code an:

Code: Alles auswählen

#include <QCoreApplication>
#include <QDebug>

struct config {
    short id;
    short sno;
};
Ich arbeite mit QextSerialPort um Daten von einem Gerät via serieller Schnittstelle auszulesen. Grundsätzlich habe ich nur die Strukturen um die ankommenden Bytes zu interpretieren. Da etwas damit gearbeitet werden soll, haben die Konfigurationsdaten des Gerätes eine Objekt-Klasse bekommen.

Code: Alles auswählen

class o_Config
{
private:
    struct config *_structure;

public:
    explicit o_Config(struct config *cfg):
        _structure()
    { _structure = cfg; }

    struct config *getStruct()
    { return _structure; }
};
Darin steckt grob gesagt ein Zeiger auf die eingelesenen Daten. Da sollen auch noch gewisse Aufbereitungen für die Ausgabe hinein. Kommen wir jetzt zur Geräteklasse. Die verbindet sich via QextSerialPort mit dem Gerät und fragt z.B. die Konfiguration ab. Das habe ich hier mal etwas hineingetrickst.

Code: Alles auswählen

class o_Device
{
private:
    o_Config *_cfg;
    void init()
    {
        readCfg();
    }

    void readCfg()
    {
        struct config cfg;
        cfg.id = 1;
        cfg.sno = 123;

        struct config *cfgPntr = &cfg;
        _cfg = new o_Config(cfgPntr);
    }

public:
    explicit o_Device():
        _cfg()
    { init(); }

    struct config *getCfgStruct()
    { return _cfg->getStruct(); }

};
So, die Public-Funktionen deuten es schon an. Es soll wohl die Struktur im Hauptprogramm zur Verfügung stehen.

Code: Alles auswählen

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    o_Device* o_dev = new o_Device();
    struct config* myCfg = o_dev->getCfgStruct();

    qDebug() << "id:" << myCfg->id;
    qDebug() << "sno:" << myCfg->sno;

    return a.exec();
}
Allerdings hat der Code insgesamt zur Folge, dass eben nichts verlässliches herauskommt. Könnte sich da jemand hineindenken oder sieht jemand sofort was hier warum nicht geht? Konkret erhalte ich als Ausgabe:
id: 1
sno: 34
Grüße,
leif

Re: Verständnisproblem mit Klassen, Zeigern oder Instanzieru

Verfasst: 17. September 2014 16:13
von nebler
Ich hab den Fehler gefunden :-)

Code: Alles auswählen

    void readCfg()
    {
        struct config cfg; // Legt lokal eine Variable 'cfg' mit dem Typ 'config' an
        cfg.id = 1;
        cfg.sno = 123;

        struct config *cfgPntr = &cfg;
        _cfg = new o_Config(cfgPntr);
    } // gibt nach verlassen den allokierten speicher von lokalen variablen wie 'cfg' wieder frei, ab der stelle stchaut der 'structure' ptr auf ein ungültigen speicherbereich

Lsg:
struct config* cfg = new config();


PS: Schonmal was von namespaces gehört? Somit könntest Dir den Prefix 'o_' sparen und vllt die Datenstrukturen sinnvoll in einem namespace gruppieren.

Re: Verständnisproblem mit Klassen, Zeigern oder Instanzieru

Verfasst: 17. September 2014 16:14
von leif
Jetzt sehe ich es endlich. Klar verfällt die Gültigkeit der Struktur mit dem Ende von o_Device::readCfg() und damit ist auch der Zeiger unbrauchbar. Nicht wahr?

Edit: Danke dir trotzdem...
Kaffee+Kippe und etwas frische Luft haben hier auch gerade aufgeräumt.

Re: Verständnisproblem mit Klassen, Zeigern oder Instanzieru

Verfasst: 17. September 2014 16:17
von leif
Ja, ich wäre auch für Tipps dankbar, da ich erst seit zwei Wochen mit Qt arbeite und auch das erste Mal richtig mit C++. Der Code oben, natürlich noch mit Standardkonstruktoren und Destrukturen, ist mehr oder weniger mein state-of-the-art.