Dynamische Speicherverwaltung in C++.

Hallo!
Ich blicke bei der dynamischen Speicherverwaltung unter C++ einfach nicht mehr durch.
Deshalb versuch ich jetzt einfach mal aufzuschreiben was ich weiss und bitte euch, mich zu korrigieren bzw. meine Fragen zu beantworten :p.
Also, ich schiess mal los:

-----------------------------------------
Code:
string *teststring = new string[2];
Dieser Befehl fordert den Zeiger auf ein String-Array mit zwei String-Objekten an, teststring[0] und teststring[1]. Wenn ich ein Objekt füllen möchte:
Code:
teststring[0]="Hallo Peter, hast du etwas von Urs gehoert?";
Frage -> Wieviele Zeichen hab' ich denn jetzt zur Verfügung? Unendlich viele könnens ja nicht sein, wann merk ich wenn der Speicher aufgebraucht ist? Oder kann ich da einfach bedenkenlos Text einfüllen?
Mit delete[] teststring geb ich den reservierten Platz wieder frei.

------------------------------------------
Ich möchte eine Funktion, die den Rückgabewert in ein wie oben deklariertes String-Objekt schreibt.
Ich übergebe dafür ein einen String an die Funktion.
Code:
string teststringnormal="hallo welt";
string *testfunktion(string); 
teststring[0]=testfunktion(teststringnormal);

Weshalb gibt es aber eine Fehlermeldung, wenn ich anstatt string *testfunktion(string) nur string testfunktion(string) schribe? Oder anders gefragt: was bringt ein Zeiger auf eine Funktion?

--------------------------------------------
Gibt es ein Unterschied zwischen:
Code:
string teststringnormal="hallo welt";
string *testfunktion(string);
teststring[0]=testfunktion(teststring);
und
Code:
string *teststring = new string[2];
teststring[0]="hallo welt";
string *testfunktion(string)
teststring[1]=testfunktion(teststring[0]);

-----------------------------------------------------------------------------------------

So ich hoffe, dass mir jemand meine Fragen beantworten kann.
Ein Link auf ein _gutes_ Tutorial würde mir natürlich auch helfen, leider habe ich bis jetzt immer nur Tutorials gefunden die am Thema vorbeigehen oder aber nicht auf _meine_ Fragen antwortet :)

Vielen Dank an Euch alle!
 
Also ich versuch mal was ich kann :D.

1. Wenn du ein Array von zwei Strings erzeugst hat jeder davon ja die maximale Länge eines Strings. Sprich du kannst da ziehmlich viele Zeichen eintragen.
genauere Werte sind bei Google zu finden.

2. Deine Funktion ist nicht wirklich korrekt deklariert (ohne Zeiger).

string *testfunktion(string);
Da fehlt ja bei dem Parameter der bezeichner des parameters.
Also:
Code:
string testfunktion(string mein_String);

Wenn du einen pointer auf die Funktion benutzt sieht er nur den "Typ der Funktion".
<-- Korrigiert mich bitte.

3. Im Prinzip gibts da keinen Unterschied. Nur das teststring[0] beim ersten Beispiel eigentlich nicht deklariert ist. Außerdem ist teststring nicht deklariert. Also die ersten Funktion is ein bissi komisch ?(


Hoffe konnte helfen und is einigemaßen richtig.

MFG
Ace
 
Weshalb gibt es aber eine Fehlermeldung, wenn ich anstatt string *testfunktion(string) nur string testfunktion(string) schribe? Oder anders gefragt: was bringt ein Zeiger auf eine Funktion?

string *foo(string a) ist kein Funktionszeiger, sondern eine Funktion die einen Pointer auf einen string zurückgibt. Da du die Rückgabe der Funktion einem Array zuweisen willst(intern sind Arrays lediglich Zeiger auf das erste Element), muss die Funktion einen Zeiger zurückgeben.

Code:
string teststringnormal="hallo welt";
string *testfunktion(string); 
teststring[0]=testfunktion(teststringnormal);

Bei der zweiten Zeile handelt es sich nicht um eine Deklaration eines Funktionszeigers, sondern um den Prototyp der Funktion, damit er dem folgenden Code schon bekannt ist, auch wenn die Funktion noch nicht deklariert wurde, auch genannt Vorwärtsdeklaration genannt. Das brauchst du z.B. wenn die Funktion weiter hinten in der Datei steht, als der Code in dem sie verwendet wird, oder wenn du mit Header-Dateien arbeitest.
Hier mal ein Beispiel zur Verdeutlichung:
Code:
#include <iostream>
#include <string>

using namespace std;


int main(int argc,char **argv)
{
        string *foo(); //Ohne diese Zeile geht's nicht
        string *b = foo();
        cout << *b << endl;
        return 0;
}

string *foo()
{
        string *a = new string[1];
        *a="abc";
        return a;
}


Frage -> Wieviele Zeichen hab' ich denn jetzt zur Verfügung? Unendlich viele könnens ja nicht sein, wann merk ich wenn der Speicher aufgebraucht ist? Oder kann ich da einfach bedenkenlos Text einfüllen?

Unendlich viele natürlich nicht, schließlich ist deine Arbeitsspeicher auch nur endlich, aber die string-Klasse kümmert sich darum genug Speicher zu allozieren, daher brauchst du dir darum keine Gedanken zu machen(Ich gehe mal davon aus, dass Du nicht vor hast >1GB in einem String zu speichern).
 
Zurück
Oben