2009-08-08 11 views
0

Ist es möglich, die Menge des zugewiesenen Speichers in einem freien Speicher, auf den ein Zeiger zeigt, schrittweise zu erhöhen? Zum Beispiel weiß ich, dass dies möglich ist.Möglichkeit, den auf freien Speicher zugewiesenen Speicher zu erhöhen

char* p = new char; // allocates one char to free store 
char* p = new char[10]; // allocates 10 chars to free store 

aber was, wenn ich etwas tun wollte, wie die Menge an Speicher erhöhen, auf die ein Zeiger zeigt. So etwas wie ...

char input; 
char*p = 0; 
while(cin >> input) // store input chars into an array in the free store 
    char* p = new char(input); 

offensichtlich wird dies nur p Punkt auf den neuen Eingang zugewiesen, aber hoffentlich verstehen, dass das Ziel, eine neue char Zuweisung an die Adresse hinzuzufügen ist, dass p Punkte zu, und speichern Sie die neueste Eingabe dort. Ist das möglich? Oder bin ich gerade bei der Zuweisung einer festen Nummer stecken geblieben.

+0

Frage: Versuchen Sie eine String-Klasse zu erstellen? – jkeys

Antwort

2

Sie können dies mit Hilfe der Funktion realloc(), obwohl das nur für Speicher funktioniert, der mit malloc() statt "neu"

zugewiesen ist, obwohl das gesagt hat, dass Sie wahrscheinlich nicht mehr Speicher byteweise zuweisen möchten. Aus Gründen der Effizienz sollten Sie in Blöcken viel größer als ein einzelnes Byte reservieren und verfolgen, wie viel Sie tatsächlich verwendet haben.

+0

Ja, ich schätze, wenn man auf diesem niedrigen Level ohne ausgefallene Container arbeitet, kann man nicht erwarten, dass man dieselben Annehmlichkeiten hat. Ich habe gerade eine bestimmte Anzahl von Blöcken zugewiesen und einen Zähler verwendet, um die Daten in ihnen zu verfolgen und zu speichern. Das ist es, was ich ursprünglich geplant habe, aber ich bevorzuge nur so viel, wie ich brauche. – trikker

+1

Mischen von Heap und FreeStore spezifische Funktionen würde/sollten Sie einen Pass an die Front der Arbeitslosengrenze bekommen. Wenn Sie diese Art dynamischer Größenanpassung, aber lineares Array wirklich wollen, verwenden Sie einen std :: vector. – Kit10

4

Die C-Lösung ist malloc zu verwenden, anstatt neue - das realloc zur Verfügung stellt. Die C++ - Lösung verwendet std :: vector und andere nette Container, die sich um diese Low-Level-Probleme kümmern und Sie auf einer viel höheren, viel besseren Abstraktionsebene arbeiten lassen! -)

+0

Ich lerne über Zeiger und darüber, wie diese Low-Level-Konzepte funktionieren. – trikker

+0

Dann ist es mehr eine C als eine C++ Frage (obwohl C++ Sie mit Zeigern auch durcheinander bringen kann, bietet es natürlich ausgezeichnete Alternativen ;-). –

1

Sie scheinen C++ zu verwenden. Während Sie realloc verwenden können, ermöglicht es C++, die explizite Speicherverwaltung zu vermeiden, die sicherer, einfacher und wahrscheinlich effizienter ist, als dies selbst zu tun.

In Ihrem Beispiel möchten Sie std :: vector als eine Container-Klasse für Zeichen verwenden. std :: vector wird automatisch nach Bedarf wachsen.

In der Tat, in Ihrem Fall könnten Sie eine std::istreambuf_iterator und std:push_back-std::copy die Eingabe in ein std::vector verwenden.

Verwandte Themen