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"<
cout<<"refcount: "<<*(p1.refcount)<
p2 = p1; // 参照カウントが+1されて2になる
cout<<"refcount: "<<*(p1.refcount)<
if(img.empty()) {
std::cerr<<"can't load image."<
{ cvReleaseMat(&obj); }
template<> inline void Ptr
{ cvReleaseImage(&obj); }
[/cpp]
OpenCV 1.0ではメモリのアロケートに cvAlloc() という malloc() のラッパーが使われていましたが、
OpenCV 2.0ではその代わりに fastMalloc() という関数が用意され、cv::Ptr内でもコールされています。
少し中を覗いてみると、どうやらシステムコールの mmap() でアロケートしているようです。
(Windowsでは普通のmalloc()が呼ばれる模様)
詳しくはまだ読めていませんが、fastというくらいだからきっと速くなっているんでしょう。
メモリ管理を cv::Ptr に任せておくと開発が楽になるのは間違いなさそうです。
関連記事:
OpenCV 2.0を試してみた