[转]http://hi.baidu.com/maxint/blog/item/fc817c2f29881f331e3089ef.html

1. 安全指针

从opencv2.0开始,很多C数据结构变成了C++的类,考虑到兼容性,保留旧的API。在内存管理方面,提供安全指针类Ptr,让在此以前旧的需要手动管理内存的数据结构(IplImage, CvMat等)无需手动Release,用法为:

Ptr<IplImage> img = cvReadImage("Lena.jpg");

Ptr是一个模板类,在opencv中定义如下:

template<typename _Tp> class Ptr{public:        Ptr();        Ptr(_Tp* _obj);     ~Ptr();        Ptr(const Ptr& ptr);        Ptr& operator = (const Ptr& ptr);  void addref();void release();void delete_obj();bool empty() const;      _Tp* operator -> ();const _Tp* operator -> () const;   operator _Tp* ();  operator const _Tp*() const;protected:        _Tp* obj;   int* refcount;};

上述源码定义在原有的指针类加了个指针引用数(refcount),对一些操作符进行了重载(operator ->;())。值得注意的是,Ptr template 对指针指向的对象有一个要求,就是可以用 delete 操作土符来释放内存。你可能就想到 IplImage 就不满足这个要求了,这怎么办?可以使用模板特化(template specialization)重载 Ptr<Iplimage>::delete_obj() 函数:

template<> inline void Ptr<IplImage>::delete_obj(){ cvReleaseImage(&obj); }

2. 指针对齐(http://bytes.com/topic/c/answers/213142-what-pointer-alignment)

为什么要指针对齐? 这是因为在某些架构上,只有能被指定数(如4,16)整除的内存地址才能够被访问,否则程序会crash,或者出现错误的结果,或者数据的访问变慢。举个例子来说,很多系统都要求interger的地址从偶数开始。opencv2.0以上版本很多指针都是被对齐过的,使指针地址能够被16整除。opencv中的内存一般是通过malloc分配,不能保证都是都能被16整除,此时需要截断,但是剩下的内存要如何维护? CV2.0的这样维护的:在 malloc 是多申请一个指针的空间,这个指针指向 malloc 得到的真实内存地址,只在 free 时使用它。相关函数:

typedef unsigned char uchar;#define CV_MALLOC_ALIGN 16template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp)){   return (_Tp*)(((size_t)ptr + n-1) & -n);}__declspec(dllexport) void* fastMalloc( size_t size ){       uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);           //HERE 多申请一个 void* 的空间用于存储 udata    uchar** adata = alignPtr((uchar**)udata + 1, CV_MALLOC_ALIGN);       adata[-1] = udata; //<- 存储 udata    return adata;}__declspec(dllexport) void fastFree(void* ptr){    if(ptr)    {           uchar* udata = ((uchar**)ptr)[-1];            assert(udata < (uchar*)ptr && ((uchar*)ptr - udata) <= (ptrdiff_t)(sizeof(void*)+CV_MALLOC_ALIGN));         free(udata);      }}

转载于:https://www.cnblogs.com/summerRQ/articles/2408767.html

opencv中的安全指针和指针对齐相关推荐

  1. OpenCV中图像Mat,二维指针和CxImage类之间的转换

    在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  2. OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  3. OpenCV 【一】—— OpenCV中数组指针、图像分块计算、指针取像素值与MatToEigen方法,内存对齐

    { Topic1: 高效开辟内存,使适用于大型数组.//开辟新数组,或者开辟新的0或者某一数值的数组/Mat或者Map直接使用memset //大数组操作效率较高 举例1:cv::Mat cv_ncc ...

  4. opencv获取mat的指针_数字图像处理之opencv中Mat数据操作

    数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...

  5. C语言使用指针处理opencv中的Mat图像数据

    1.在处理图像时,一般直接使用opencv中的imread函数获取图片,但是获取到图片后没有用到opencv中的其他算法时,直接用图片处理就会出现耗时严重的情况,所以需要将图片形式转换成指针数组形式处 ...

  6. 【OpenCV】OpenCV实战从入门到精通之 -- 指针访问、迭代器iterator、动态地址计算配合at元素

    目录 1.指针访问像素 2.迭代器操作像素 3.动态地址计算 OpenCV中,有三种方式访问图像像素: 指针访问:C操作符[]: 迭代器iterator 动态地址计算 上述方法在访问速度上略有差异.d ...

  7. rtthread 字节对齐问题 int指针访问非对齐地址崩溃

    rtthread 字节对齐问题 int指针访问非对齐地址崩溃 环境: SOC: i.MX RT1050 底板: 野火 RT1052 Kernel: rt-thread 背景: 我正在实现解析udp包, ...

  8. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  9. c++中关于char数组/char*指针/string类型

    c++中关于char数组/char*指针/string 小渣渣一直被有关string和char[]以及char*的相关问题弄得痛不欲生,传参.返回值.函数调用等到底应该用哪种形式这真的是让小渣癫狂了, ...

最新文章

  1. 有一群200w年薪的朋友是什么感觉?谈一谈入学中国科学院大学的几点感受吧
  2. Google Chrome 72 丢弃HPKP,不再支持TLS1.0和TLS1.1!
  3. 直播 | LiveVideoStack Meet杭州:后直播时代技术
  4. SAP如何批量设置采购信息记录删除标记
  5. 32和64位jvm_我应该使用32位还是64位JVM?
  6. iview table 方法若干
  7. LeetCode-105:从前序与中序遍历序列构造二叉树
  8. 我学Delphi心得及笔记----内存(第七讲)
  9. keystore was tampered with,or password was incorrect解决办法
  10. 三个角度细谈:如何发挥朋友圈广告的威力
  11. vue 使用 :class 根据不同状态值设置状态文字颜色不同
  12. SyntaxError: Missing parentheses in call to 'print' 问题原因
  13. 分布式计算框架Hadoop原理及架构全解
  14. 成功人士每天早上的15个习惯
  15. SteamVR Unity Tool Kit(二):激光与移动
  16. OIM同步OID(OID-Connector 9.0.4.12)
  17. android 软键盘的从属关系,Android控件属性大全
  18. COOX培训材料 — PMT(5.物料配方工单)
  19. 数据库---数据查询
  20. GE反射内存卡的指标和型号

热门文章

  1. php 实现树状组织图插件,使用jstree插件实现树形结构
  2. python3语法糖_python的语法糖
  3. 语言迭代发_从今天开始,每天学点R语言~
  4. 多个折线样式_新技能get,折线图转化成多阶梯瀑布图
  5. 计算机组装与维修考试试卷,计算机组装与维修期末考试试卷..doc
  6. update yum 到指定版本_CentOS 使用yum update 更新时保留特定版本的软件
  7. 前台啊,就是这么杂!
  8. xml和html是兄弟还是父子?
  9. 十六进制转换html,如何使用JavaScript将十进制转换为十六进制?
  10. make,make install命令