Placement New bietet eine Möglichkeit, Speicher für Objekte an einem bestimmten Speicherort zuzuweisen. Während die Verwendung mit Arrays unkompliziert erscheint, kann das Erreichen der Portabilität eine Herausforderung darstellen.
Das Problem
Betrachten Sie das folgende Beispiel:
char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS];
Hier: pBuffer enthält einen Puffer für das durch new[] zugewiesene Array. Allerdings gibt new(pBuffer) A[NUMELEMENTS] möglicherweise nicht dieselbe Adresse wie pBuffer zurück, was möglicherweise zu einer Speicherbeschädigung führt.
Behebung des Problems
Ein Ansatz besteht darin, Folgendes zu tun: Platzieren Sie jedes Array-Element manuell einzeln mit der neuen Platzierung:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
Dadurch wird sichergestellt, dass jedes Element an der richtigen Position innerhalb des Arrays zugewiesen wird Puffer.
Handhabung von Destruktoren
Beim Löschen des Arrays ist es wichtig, die Destruktoren für jedes Element manuell aufzurufen, bevor der Puffer gelöscht wird:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer;
Dieser Ansatz garantiert eine ordnungsgemäße Objektbereinigung und Speicher Freigabe aufheben.
Fazit
Neue Platzierung für Arrays stellt Portabilitätsprobleme dar, da es zu einer möglichen Fehlausrichtung zwischen zugewiesenen und zurückgegebenen Adressen kommen kann. Durch die manuelle Platzierung jedes Array-Elements und die Handhabung von Destruktoren können Entwickler diese Herausforderungen meistern und die Platzierung sicher in portablem Code nutzen.
Das obige ist der detaillierte Inhalt vonWie kann Placement New sicher für Arrays in portablem Code verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!