Ich arbeite an einem Codeabschnitt, der viele mögliche Fehlerpunkte aufweist, die dazu führen, dass die Funktion vorzeitig beendet wird. Die Bibliotheken, mit denen ich interagiere, erfordern, dass C-artige Arrays an die Funktionen übergeben werden. Anstatt also an jedem Ausgangspunkt auf den Arrays löschen Aufruf, mache ich das:Können Sie ein shared_ptr für RAII von C-artigen Arrays verwenden?
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength]);
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
Ich wollte unique_ptr
verwenden, aber meine aktuellen Compiler nicht unterstützt und der Referenzzähler Kopf nicht wirklich wichtig in diesem Fall.
Ich frage mich nur, ob jemand irgendwelche Gedanken über diese Praxis hat, wenn es mit Legacy-Code Schnittstellen.
UPDATE Ich habe ganz vergessen über die shared_ptr
delete
statt delete []
aufrufen. Ich habe gerade keine Speicherlecks gesehen und beschlossen, damit zu gehen. Ich habe nicht einmal daran gedacht, einen Vektor zu verwenden. Seit ich mich in letzter Zeit mit C++ beschäftigt habe, denke ich, dass ich einen Fall von "Wenn das einzige Werkzeug, das du hast, ein Hammer ist, sieht alles wie ein Nagel aus." Syndrom. Danke für die Rückmeldung.
UPDATE2 Ich dachte, ich würde die Frage ändern und eine Antwort geben, um es ein wenig wertvoller für jemanden zu machen, der den gleichen Fehler macht wie ich. Zwar gibt es Alternativen wie scoped_array
, shared_array
und vector
, können Sie einen shared_ptr
verwenden Umfang eines Arrays zu verwalten (aber danach habe ich keine Ahnung, warum ich wollen würde):
template <typename T>
class ArrayDeleter
{
public:
void operator() (T* d) const
{
delete [] d;
}
};
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength], ArrayDeleter<char>());
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
Nitpicking: [[shared_ptr]] funktioniert nicht korrekt auf dynamischen Array-Zeigern. Verwenden Sie [[scoped_array]] oder [[shared_array]]. – rwong