Kürzlich stieß ich auf ein Beispiel, dass mein Destruktor einen Parameter nehmen muss.Warum Destruktoren Parameter in C++ nicht akzeptiert?
Ich arbeite an einem C-Paket, das Speicher intern verwaltet und verfolgt die Zuweisung und Freigabe mit eigenen Parametern. Ich will das nicht brechen.
Ich schrieb einen C-Code, der meine eigenen Datenstrukturen initialisiert und am Ende freigibt. Als ich mich entschloss, nach C++ zu migrieren, wurde mir klar, dass das Zuordnen und Freigeben von Datenstrukturen in Konstruktoren und Destruktoren platziert werden sollte. Also habe ich diese Funktionen in Konstruktor und Destruktor geändert. Mein Problem ist jetzt, dass ich einen Parameter verwenden muss, um an den Destruktor zu übergeben, um zugewiesene Daten freizugeben; Dieser Parameter ist nicht in meinem eigenen Code und ist C und ich möchte mich damit nicht anlegen.
Meine Frage ist zweifach:
Warum C++ in Destruktoren in erster Linie nicht zu akzeptieren Parameter entschieden? und Was sind meine Optionen? (Ich kann einen Zeiger auf diese Parameter speichern oder irgendwie diese Funktion in meinem destructor nennen, aber es scheint nicht eine gute Praxis der C++ Programmierung)
Update: einige Code hinzufügen Hier ist meine imaginäre Klasse:
class paru_symbolic/* paru_symbolic*/
{
public:
paru_symbolic (cholmod_sparse *A, cholmod_common *cc); // constructor
~paru_symbolic (cholmod_common *cc); // destructor
// -------------------------------------------------------------------------
// row-form of the input matrix and its permutations
// -----------------------------------------------------------------------
//--- other stuff
...
};
Hier ist mein aktueller C-Konstruktor:
#include "Parallel_LU.hpp"
paru_symbolic *paru_sym_analyse
(
// inputs, not modified
cholmod_sparse *A,
// workspace and parameters
cholmod_common *cc){
DEBUGLEVEL(0);
...
aParent = (Int*) paru_alloc (m+nf, sizeof(Int),cc);
...
}
und destructor:
void paru_freesym (paru_symbolic **LUsym_handle,
// workspace and parameters
cholmod_common *cc
){
DEBUGLEVEL (0);
if (LUsym_handle == NULL || *LUsym_handle == NULL){
// nothing to do; caller probably ran out of memory
return;
}
paru_symbolic *LUsym;
LUsym = *LUsym_handle;
Int m, n, anz, nf, rjsize;
...
cholmod_l_free (m+nf, sizeof (Int), LUsym->aParent, cc);
...
cholmod_l_free (1, sizeof (paru_symbolic), LUsym, cc);
*LUsym_handle = NULL;
}
Der Parameter cc wird innerhalb des SuiteSparse-Pakets zum Verfolgen von Zuordnungen und Freigeben von Daten verwendet. Es wurde bereits im SuiteSparse-Paket verwendet und ist ein nützliches Tool zum Verfolgen von Speicher. Einige Leute erwähnt, dass, wer einen Parameter an den Destruktor übergeben will. Das ist ein guter Punkt, aber wir könnten die gleichen Parameter haben, die wir im Konstruktor als Standard haben.
Mögliches Duplikat von [Destruktor-Parameter] (https://StackOverflow.com/questions/6245295/destructor-parameters) –
Klassen sollen in sich abgeschlossen sein, und Schnittstellen sollen relativ eng sein. Wenn eine Klasse Daten enthält, die verwaltet werden müssen (zum Beispiel, die zum Zeitpunkt des Zerstörens freigegeben werden müssen), sollte die Klasse alles darüber wissen. Es ist schwer vorstellbar, dass Daten an den Destruktor übergeben werden müssen, die die Klasse bereits intern (also in Member-Variablen) nicht kennen sollte. Was ist Ihr Beispiel für Parameter, die Sie an den Destruktor übergeben müssen? –
Wie würden Sie die Parameter übergeben? – drescherjm