2016-03-31 14 views
0

参照カウントを使用してリソースを管理するクラスを作成しています。は参照を使用してオブジェクトを渡す必要があります。参照カウントクラスの参照カウントを増やす

クラスが参照を使用して関数に渡された場合は、参照を追加する必要がありますか?

私のオブジェクトがその参照を介して関数に渡された場合、コピーコンストラクタまたは他のメソッドが呼び出されますか?

たとえば、share_pointerまたはcv :: Matでどのように実装されているか知りたいと思います。

リファレンスを使用してメソッドにcv :: Matを渡すと、参照カウンタが追加されますか?例えば

:通常

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

エクササイズとして、参照渡し(またはこの問題のポインタ)を追跡する参照カウントクラスを作成できます。成功すれば教えてください。 – SergeyA

答えて

2

クラスは、そのオブジェクトのコピー数が存在する保存された参照カウントを有します。オブジェクトを参照渡しすると、コピーは作成されません。コンパイラがポインタを使用しているか、実際のオブジェクトを使用している可能性がありますが、参照カウンタが増加しないようにコピーを作成していません。

+0

私はベクトルを持っているときはどうですか?このタイプのオブジェクトへの参照を渡すと、イメージの参照カウントが追加されますか? – mans

+0

@mansベクトルを参照で渡すと何もコピーされないので、参照カウントは増加しません。参照カウントは、コピーコンストラクタまたはコピー代入演算子が呼び出されたときにのみ増加する可能性があります。 – NathanOliver

2

参照カウントは一般に、コピーコンストラクタ、代入演算子、およびデストラクタで追跡されます。参照渡しの場合、それらの関数のどれも呼び出されないので、参照カウントは変更されません。

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 
関連する問題