# Struktur als Rückgabewert



## cesupa (26. Mai 2006)

Hallo,

ich hab mir grad ein paar DLL's für mein neues Projekt zusammengebastelt in der ich Funktionen habe die eine von mir kreierte Struktur zurückgeben:


```
typedef struct error
{
        int error;
        char *error_message;
        };
```

Wenn ich die Struktur jetzt in einer Funktion als Rückgabewert benutze erhalte ich immer einen Windows-Fehler, ich vermute mal stark man muss die Struktur nach benutzung löschen, aber wie kann ich eine Struktur nach einer return Anweisung löschen?


```
error* funktion()
{
error* er;
er->error=0;
er->error_message="Alles Super!";
return er; //Windows gibt eine Fehlermeldung aus
}
```

Wenn ich das 'return er' durch ein 'delete er' ersetze funktioniert das ganze, aber ich will jadie Struktur zurückgeben. 
Hoffe ihr könnt mir helfen.

Gruß
cesupa


----------



## MADCat_CT (26. Mai 2006)

hi,


```
error* funktion()
{
error* er;
er = new error;
er->error=0;
er->error_message="Alles Super!";
return er;
}
```

du darfst nur nicht vergessen den speicherplatz wieder frei zu geben


----------



## cesupa (27. Mai 2006)

Danke, hat funktioniert. 

Gruß
cesupa


----------



## cesupa (28. Mai 2006)

Hallo nochmal,

das ganze hat wohl doch noch nicht so einwandfrei funktioniert, zumindest nicht in folgender Funktion:


```
error* start_send_data(SOCKET s)
{
       char buf[256];
       error* er;
       er=new error;
       int size,n;
    n=senden(s,"DATA\r\n",-1,0);
    
    n=empf(s,buf,sizeof(buf),0);
    if(buf[0]=='5')
    {
                   
                   er->error=-14;
                   er->error_message=buf;
                   return er;
                   }
    er->error=0;
    er->error_message="Alles Super!";
    return er;
       }
```

Wenn ich die Ausführe kommt Windows mit einer Fehlermeldung: ...Der Vorgang "written" kann auf den Speicher nicht ausgeführt werden...

Wie kann ich diesen Fehler beseitigen?

Gruß
cesupa


----------



## mueslirocker (29. Mai 2006)

Ich denke, das Problem liegt bei dieser Zeile:

```
er->error_message=buf;
```
buf ist lokal und wird nach dem return nicht mehr reserviert sein.
Ich würde eher für error_message Speicher reservieren und die Nachricht da reinkopieren.

```
er->error_message = new char[256]; // <- strlen(buf) statt 256 sollte auch gehen
strcpy(error_message, buf);
```
Wie bei dem Struct selbst gilt hier natürlich auch, dass der Speicher irgendwo wieder freigegeben werden muss.
strcpy ist eine C-Standardfunktion.. wenn ich mich recht erinnere in der <string.h>, die inkludiert werden möchte.

Ob das nun der Fehler war, weiß ich nicht genau.. so gut kenn ich mich mit C leider (noch  ) nicht aus.

In C++ solltest du solche Probleme aber gar nicht mehr haben.. Objekte können wie primitive Datentypen einfach zurückgegeben werden. Der new Operator ist dann nicht mehr nötig und das Objekt ist außerhalb der Funktion weiter gültig.
Ebenso muss man sich dann nicht mehr um die Speicherverwaltung von Strings kümmern.


----------

