2012-04-06 5 views
1

ich schwer zu verdauen diese Syntax habe:Operator new [] Definition Aufschlüsselung

void* operator new[](std::size_t, const std::nothrow_t&) throw(); 

während dies noch verstanden:

void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw(); 

Frage:

  1. Ich dachte new und Index [] sind verschiedene Operatoren. Wie können wir zwei Operatoren kombinieren, um eine Definition zu überladen?

  2. Auch die nowthrow. Der folgende Aufruf ergibt für mich keinen Sinn (bezüglich der Signatur der Funktion).

    int * p2 = new (nothrow) int; 
    

Wenn jemand Bezug zu verwandten Themen aus Bjarne Stroustrup Buch geben kann, die große, nicht eine harte Forderung allerdings wäre.

UPDATE: Bitte versuchen, beide Fragen zu beantworten :)

+0

Stroustrups Bücher sind keine Referenzen - der C++ Standard ist. Näheres zum Standard finden Sie kostenlos [hier] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf). – ildjarn

+0

'new []' ist ein eindeutiger Operator zu 'new' ... –

+0

Ich meinte Verweis auf verwandte 'konzeptionelle Thema'. Ich lese dieses Buch und beende gerade das Überladen des Operators und ich dachte, dass ich mit allem, was mit diesem Thema zu tun hat, fertig bin. Aber diese Definition bringt mich in Schwindel. – PnotNP

Antwort

2

Die ersten beiden sind die Signaturen der globalen neuen Operatoren. Für was (wenig) es sich lohnt, wird operator new verwendet, um Speicherplatz für einen neuen Ausdruck wie x = new T; zuzuweisen, während operator new[] verwendet wird, um Speicherplatz für einen neuen Ausdruck wie x = new T[count]; zuzuweisen. Das "kleine", dass es wert ist, ist aus einem ziemlich einfachen Grund: Sie sollten nie new T[count] verwenden, so wie es funktioniert, ist fast rein eine historische Kuriosität.

Sie können ::operator new und/oder ::operator new[] überlasten, um Ihre eigene Heap-Zuweisung bereitzustellen, wenn Sie möchten. Es gibt kein Unterschied zwischen den beiden so weit wie die grundlegenden Anforderungen gehen - sie beide nur zuordnen und einen Zeiger auf die Menge des angeforderten Arbeitsspeichers zurückgeben.

Soweit geht, wird die Größe, die an operator new übergeben wird immer vom Compiler basierend auf der Größe des Objekts berechnet und im Falle eines Arrays neu die Anzahl, die Sie geben. Daher wird der Parameter, den Sie im neuen Ausdruck angeben, zum zweiten Parameter, der an operator new übergeben wird.

Um einen Punkt zu betonen, ich kann nicht ganz klar über genug gemacht habe: operator new (und operator new[]) durch verwendet werden, aber getrennt von neuen Ausdrücken (was Sie in Ihrem Code haben, wenn Sie so etwas wie x = new T; sagen). operator new und operator new[] sind so ziemlich wie malloc - sie nur "rohen" Speicher zuordnen. Ein neuer Ausdruck verwendet eine davon, um unformatierten Speicher zuzuweisen, und ruft dann den Konstruktor auf, um ein Objekt (oder mehrere, im Fall von new T[count];) in diesem Speicher zuzuweisen. Die beiden sind offensichtlich verwandt, aber ebenso offensichtlich nicht wirklich dasselbe. Ein weiterer kleiner Punkt: Es ist auch möglich, eine operator new (oder operator new[] als Klassenmitglied zu haben. Dies ermöglicht Ihnen, Speicher für diese Klasse anders als für andere, die den globalen Heap verwenden. Dies ist am häufigsten mit kleine Objekte, von denen Sie erwarten, dass sie in großen Mengen zugewiesen werden.Für diese hat der globale Heap oft ziemlich viel Overhead, den Sie lieber vermeiden würden.

Schließlich können Sie, wenn Sie Rohspeicher zuweisen möchten rufen Sie auch operator new direkt auf, wie in void *a = ::operator new(1234);.Über den einzigen Ort ist dies üblich, wenn Sie sich entscheiden, eine Art von Sammelklasse selbst zu implementieren (z. B. wenn Sie einen Ringpuffer wollen).

3

new [] und [] sind zwei völlig verschiedene Operatoren.

new [] ist ein Zuweisungsoperator für Arrays, [] ist ein tiefgestellter Zugriffsoperator für Arrays.

new [] ist ein eigener Operator, es ist nicht einfach 'neuer' Allokator kombiniert mit '[]' tiefgestellter Operator.

1

new und new[] sind zwei separate Operatoren, die nicht wirklich mit dem Operator '[]' in Verbindung stehen. Dies ist am besten auf den Unterschied zwischen delete p und delete[] p zu sehen; Löschen Sie eine einzelne Instanz, auf die zeigt, oder eine ganze Reihe von Instanzen?

In ähnlicher Weise ist new[] eine Möglichkeit, ein ganzes Array von Objekten zuzuweisen, alle im selben Speicherblock.

Verwandte Themen