[Gelöst] Lebenszeit von Variablen und Zeiger

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
leif
Beiträge: 12
Registriert: 16. September 2014 15:09

[Gelöst] Lebenszeit von Variablen und Zeiger

Beitrag 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
Zuletzt geändert von leif am 18. September 2014 08:49, insgesamt 1-mal geändert.
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: Verständnisproblem mit Klassen, Zeigern oder Instanzieru

Beitrag 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.
Zuletzt geändert von nebler am 17. September 2014 16:14, insgesamt 1-mal geändert.
leif
Beiträge: 12
Registriert: 16. September 2014 15:09

Re: Verständnisproblem mit Klassen, Zeigern oder Instanzieru

Beitrag 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.
leif
Beiträge: 12
Registriert: 16. September 2014 15:09

Re: Verständnisproblem mit Klassen, Zeigern oder Instanzieru

Beitrag 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.
Antworten