Ich nehme an, Sie können SMOE_STRUCT
nicht ändern, um einen Destruktor hinzuzufügen. Damit haben Sie zwei Optionen: einen benutzerdefinierten Löschvorgang und eine Kapselung.
Erstens könnten Sie eine benutzerdefinierte deleter für die Verwendung mit std::unique_ptr
erstellen:
struct SOME_STRUCT_Deleter
{
void operator() (SOME_STRUCT *p) const
{
delete[] p->SOME_MEMBER;
delete p;
}
};
std::unique_ptr<SOME_STRUCT, SOME_STRUCT_Deleter> ptr{new SOME_STRUCT};
ptr->SOME_MEMBER = new BYTE[100];
CallSomeAPI(ptr.get());
Wenn Sie feststellen, dass, im Gegensatz zu der Situation in Ihrer Frage beschrieben, Miteigentum Sie passen würde besser als ausschließliches, können Sie die deleter mit einem shared_ptr
als auch, wie folgt aus:
std::shared_ptr<SOME_STRUCT> ptr{new SOME_STRUCT, SOME_STRUCT_Deleter{}};
ptr->SOME_MEMBER = new BYTE[100];
CallSomeAPI(ptr.get());
eine zweite Option, die ich bevorzugt zu finden, ist zu wickeln SOME_STRUCT
:
struct SOME_STRUCT_plus_plus
{
SOME_STRUCT s;
~SOME_STRUCT_plus_plus()
{
delete[] s.SOME_MEMBER;
}
SOME_STRUCT_plus_plus()
{
s.SOME_MEMBER = new BYTE[100];
}
};
std::unique_ptr<SOME_STRUCT_plus_plus> ptr{new SOME_STRUCT_plus_plus};
CallSomeAPI(&ptr->s);
Sie könnten sogar „wrap“ es SOME_STRUCT_plus_plus
, indem sie stammen aus SOME_STRUCT
, anstatt sie zu aggregieren, die Sie ohne die Notwendigkeit, den direkten Zugriff auf Mitglieder durch s
gehen würde. Gleichzeitig könnte es zu Speicherlecks kommen, wenn jemand SOME_STRUCT_plus_plus*
auf SOME_STRUCT*
und dann delete
auf ihn wirft.
Warum Sie eine 'std :: unique_ptr' verwenden? Die neuen Smart Pointer sollten nicht wirklich als Ersatz für den normalen Pointer gesehen werden, sondern eher als Umgang mit dem Besitz: Kann eine Ressource (Speicher, Datei, Gerät usw.) mehreren Eigentümern gehören ('std :: shared_ptr') oder von nur einem einzigen Besitzer ('std :: unique_ptr') gleichzeitig? –
Eigentlich möchte ich einen intelligenten Zeiger verwenden, um die Zuordnung automatisch zu entziehen, nicht unbedingt unique_ptr, mein Hauptziel ist automatische Bereinigung und nicht Besitz. Ich habe die Frage jetzt überarbeitet, um klarer zu sein. – shaarang
Mit den intelligenten Zeigern * müssen * Sie wirklich über Besitz denken. Wenn Sie zum Beispiel ein 'std :: unique_ptr' an eine Funktion übergeben, wird die Eigentümerschaft in diese Funktion verschoben und das Objekt wird zerstört, sobald die Funktion zurückkehrt.Wenn Sie 'std :: shared_ptr' verwenden, wird das Objekt (oder der Speicher) nicht gelöscht, bis * alle * Kopien dieses freigegebenen Zeigers zerstört wurden, wenn es einen gibt, auf dem der Speicher noch zugewiesen wird. –