2016-03-31 9 views
0

Ich schreibe eine Klasse, die Referenzzählung verwendet, um ihre Ressourcen zu verwalten.sollte ein Objekt mit seiner Referenz übergeben erhöhen Sie die Referenzzahl in einer Referenz Zählklasse

Wenn die Klasse über ihre Referenz an eine Funktion übergeben wird, sollte sie hinzugefügt werden?

Wenn mein Objekt über seine Referenz an eine Funktion übergeben wird, bekomme ich einen Kopierkonstruktor oder eine andere Methode für die Klasse aufgerufen?

Zum Beispiel möchte ich wissen, wie es in einem share_pointer oder einem cv :: Mat implementiert ist.

Wenn ich eine cv :: Mat in eine Methode mit Verweis übergeben, wird ihr Referenzzähler hinzugefügt?

zum Beispiel:

void func(cv::Mat & image) 
{ 
    // what is the reference counter here? is it one or two? 
} 

main() 
{ 
    cv::Mat image; 
    // reference counter for image should be one here. 
    funct(image); 
} 
+3

Als eine Übung können Sie versuchen, eine Referenz-zählende Klasse zu schreiben, die ihre Weitergabe durch Referenz (oder Zeiger für diese Angelegenheit) verfolgen würde. Sagen Sie uns, wenn Sie Erfolg haben. – SergeyA

Antwort

2

Typischerweise, wenn eine Klasse eine Referenzzählwert hat es die Anzahl der Kopien des Objekts speichert, vorhanden sind. Wenn Sie ein Objekt als Referenz übergeben, wird keine Kopie erstellt. Der Compiler könnte einen Zeiger verwenden oder das tatsächliche Objekt verwenden, aber es erstellt keine Kopie, sodass der Referenzzähler nicht erhöht wird.

+0

was ist, wenn ich ein Mitspracherecht habe Vektor ? Wenn ich einen Verweis auf diesen Objekttyp übergebe, wird die Referenzanzahl der Bilder hinzugefügt? – mans

+0

@mans Wenn Sie den Vektor als Referenz übergeben, wird nichts kopiert, so dass die Anzahl der Referenzen nicht erhöht werden sollte. Eine Referenzzählung könnte nur zunehmen, wenn der Kopierkonstruktor oder der Kopierzuweisungsoperator aufgerufen wird. – NathanOliver

2

Referenzzählungen werden im Allgemeinen in den Kopierkonstruktoren, Zuweisungsoperatoren und Destruktoren verfolgt. Wenn Sie die Referenz übergeben, wird keine dieser Funktionen aufgerufen, sodass die Referenzzählung unverändert bleibt.

void func(cv::Mat image) //reference count increased due to copy 
{ 

} //reference count decreased due to destruction 

void func(cv::Mat& image) //no copy, reference count unchanged 
{ 

} //no destructor call, reference count unchanged