Frage

Wie kann ich realloc in C ++? Es scheint aus der Sprache zu fehlen - es gibt new und delete aber nicht resize

!

Ich brauche es, weil, wie mein Programm mehr Daten liest, ich brauche den Puffer neu zuzuordnen, es zu halten. Ich glaube nicht, deleteing die alten Zeiger und newing einen neuen, größeren, ist die richtige Wahl.

War es hilfreich?

Lösung

Verwenden :: std :: vector

Type* t = (Type*)malloc(sizeof(Type)*n) 
memset(t, 0, sizeof(Type)*m)

wird

::std::vector<Type> t(n, 0);

Dann

t = (Type*)realloc(t, sizeof(Type) * n2);

wird

t.resize(n2);

Wenn Sie Zeiger in Funktion zu übergeben wollen, anstelle von

Foo(t)

Verwendung

Foo(&t[0])

Es ist absolut richtig C ++ Code, weil Vektor ein intelligenter C-Array ist.

Andere Tipps

Die richtige Option ist wahrscheinlich um einen Behälter zu verwenden, der die Arbeit für Sie, wie std::vector.

new und delete können nicht die Größe, weil sie nur genügend Speicher zuweisen ein Objekt des angegebenen Typs zu halten. Die Größe eines bestimmten Typs wird sich nie ändern. Es gibt new[] und delete[] aber es gibt kaum einen Grund, sie zu nutzen.

Was realloc tut in C wahrscheinlich nur eine malloc, memcpy und free sein soll, wie auch immer, obwohl Speichermanager erlaubt sind klug, etwas zu tun, wenn es genügend zusammenhängende freie Speicherplatz zur Verfügung steht.

in C ++ Ändern der Größe ist umständlich, weil das Potenzial Notwendigkeit Konstruktoren und Destruktoren zu nennen.

Ich glaube nicht, dass es ein wesentlicher Grund, warum in C ++ Sie kein resize[] Betreiber gehen mit new[] und delete[] haben könnte, dass etwas getan ähnlich wie folgt aus:

newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;

Offensichtlich oldsize würde von einem geheimen Ort abgerufen werden, gleich ist es in delete[] ist, und Type vom Typ des Operanden kommen würde. resize[] fehlschlagen würde, wo der Typ nicht kopierbar ist - was richtig ist, da solche Objekte nicht einfach verlegt werden können. Schließlich wird der obige Code default-Konstrukte, die Objekte vor ihnen zuweisen, die Sie nicht als das tatsächliche Verhalten wünschen würde.

Es gibt eine mögliche Optimierung wo newsize <= oldsize, Destruktoren für die Objekte „über das Ende“ des neu ensmallened Array nennen und sonst nichts zu tun. Die Norm müsste festlegen, ob diese Optimierung erforderlich ist (wie wenn Sie einen Vektor resize()), erlaubt aber nicht näher bezeichnet, erlaubt aber abhängig von der Implementierung oder verboten.

Die Frage, die Sie dann sich stellen sollten ist, „ist es tatsächlich nützlich dies gegeben zu schaffen, dass vector auch tut es, und ist speziell ein Resize-able Behälter zu schaffen (zusammenhängenden Speicher - diese Anforderung verzichtet in C ++ 98 aber fixierte in C ++ 03), die eine bessere Passform als Arrays mit der C ++ Möglichkeiten, Dinge zu tun ist? "

Ich denke, die Antwort ist weit verbreitet dachte „Nein“ zu sein. Wenn Sie möchten, resizeable Puffer, um die C Art und Weise zu tun, die Verwendung malloc / free / realloc, die in C ++ zur Verfügung stehen. Wenn Sie resizeable Puffer, um den C ++ Art und Weise zu tun, verwenden Sie einen Vektor (oder deque, wenn Sie nicht wirklich benötigen zusammenhängenden Speicher). Versuchen Sie nicht, die beiden zu mischen durch new[] für rohe Puffer verwenden, es sei denn, Sie ein Vektor artigen Behälter sind zu implementieren.

Versuchen Sie etwas wie folgt aus:

typedef struct Board
{
    string name;
    int size = 0;
};

typedef struct tagRDATA
{
    vector <Board> myBoards(255);

    // Board DataBoard[255];
    int SelectedBoard;

} RUNDATA;

Vector wird sich beschweren. Deshalb Arrays, malloc und neue ist noch vorhanden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top