Zeiger als Rückgabewert einer Methode

Moin allerseits!

Habe ein kleines Konsolenprogramm mit Klassen und Methoden. In einer Methode wird ein Vector für Strings generiert, befüllt und zurückgegeben. Im Hauptprogramm wird der Inhalt dieses Vectors erfolgreich verarbeitet.
Bei der Überlegung aus der Methode einen Zeiger statt einer Kopie des Vectors zurückzugeben komme ich nicht weiter.

  1. Ist es so, dass nach der Abarbeitung der Methode der in ihr generierte Vector nicht mehr im Speicher sein wird?
  2. Daraus folgt dann, dass der Zeiger auf den Vector, den die Methode an die Hauptfunktion zurückgab, nutzlos ist und ich nur mit einer Kopie weiter arbeiten könnte?

Danke.
Vitali

Hi Vitali,

Objekte, die in einer Funktion/Methode lokal und non-static vereinbart werden, verlieren ihre Gueltigkeit ausserhalb derselben. Sofern man dann einen Zeiger auf sie zurueckgibt, erhaelt man Probleme.

Du kannst aber eine Kopie auf dem Heap anlegen (new) und dann einen Zeiger auf das Objekt zurueckgeben, musst allerdings spaeter dann diesen Speicher auch mit delete wieder freigeben.

Viel einfacher hier ist aber, den Vector als Referenz an die Funktion zu uebergeben, ala

void generate(std::vector& v)
{
...
}

main()
{
 std::vector v; 
 v.reserve(1000);
 generate(v);
 ...
 return 0;
}

Dann musst du keine Kopie erstellen.

Gruss
norsemanna

Hallo norsemanna,
danke für Deine Antwort.

So wie ich verstehe machst Du es genau anders: nicht die Methode liefert einen Vector an die Hauptfunktion, sondern der Vector wird in der Hauptfunktion erzeugt und eine Referenz darauf übergibst Du der Methode, welche ihr Ergebnis da rein schreibt. Richtig?

Wenn so, dann ist diese Richtung natürlich clever!
Könnte ich denn nicht auch einen Zeiger auf den Vector an die Methode übergeben?

Hi Vitali,

Vector wird in der Hauptfunktion erzeugt und eine Referenz
darauf übergibst Du der Methode, welche ihr Ergebnis da rein
schreibt. Richtig?

ja, das spart den Kopiervorgang und ist somit schneller
(wobei C++11 da ein neues Konstrukt haben sollte, bei dem nicht kopiert werden muss (zumindestens war das in der Diskussion der aufzunehmenden Features, muss mal nachschlagen)

Könnte ich denn nicht auch einen Zeiger auf den Vector an die
Methode übergeben?

ja, das kannst du natuerlich auch, wobei die Referenz der sichere Weg ist (Eine Referenz kann nicht Null werden, der Pointer schon)

Gruss
norsemanna

Wenn du, wieso auch immer, unbedingt Zeiger verwenden möchtest, kannst du diesen im Funktionskopf den Zeiger auch mit „const“ deklarieren so kannst du diesen dann in der Funktion selbst nur verwenden jedoch nicht verändern.

#include
#include

using namespace std;

void generate (const vector *v)
{

}

int main ()
{
vector v;
vector *pv;
pv = &v;
v.reserve(1000);
generate(pv);

return 0;
}

Ich würde dir trotzdem raten wie der jenige vor mir schon gesagt hat, eine Referenz zu verwenden, da sie unter anderem um einiges leichter zu verwenden ist.

Ich hoffe ich konnte dir helfen, schönen Tag noch.