OpenCV 2.0 – cv::Ptr

A template class for smart reference-counting pointers

OpenCV 2.0では cv::Ptr という参照カウント方式のスマートポインタが用意されています。
これは Boost C++ Library の shared_ptr と同様のもので大変便利です。
参考:参照カウント – Wikipedia

一時的にcv::Ptrクラスのrefcountというメンバをprotectedからpublicに変更して挙動を見てみます。
(cxcore.hppの660行目付近にあります)

[cpp]
class Test {
public:
Test() { std::cout<<"construct"< p1(new Test()); // 参照カウント 1
cout<<"refcount: "<<*(p1.refcount)< p2;
p2 = p1; // 参照カウントが+1されて2になる
cout<<"refcount: "<<*(p1.refcount)< img = cvLoadImage(“test.jpg”);

if(img.empty()) {
std::cerr<<"can't load image."< inline void Ptr::delete_obj()
{ cvReleaseMat(&obj); }

template<> inline void Ptr::delete_obj()
{ cvReleaseImage(&obj); }
[/cpp]

OpenCV 1.0ではメモリのアロケートに cvAlloc() という malloc() のラッパーが使われていましたが、
OpenCV 2.0ではその代わりに fastMalloc() という関数が用意され、cv::Ptr内でもコールされています。
少し中を覗いてみると、どうやらシステムコールの mmap() でアロケートしているようです。
(Windowsでは普通のmalloc()が呼ばれる模様)
詳しくはまだ読めていませんが、fastというくらいだからきっと速くなっているんでしょう。

メモリ管理を cv::Ptr に任せておくと開発が楽になるのは間違いなさそうです。

関連記事:
OpenCV 2.0を試してみた

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です