智能指针与memmove同时使用,造成程序崩溃

来源:互联网 发布:提醒软件reminder 编辑:程序博客网 时间:2024/06/06 00:07

       做图像处理相关项目时,碰到一个程序崩溃问题,费了很多时间和精力才找到问题。按照笔者经验,程序崩溃很大可能是释放空指针或者数组越界的原因。而笔者使用的是智能指针,想当然的认为智能指针自动累计不应该有问题才对。不断的排查原因之后,发现最终的原因是智能指针与memmove同时使用,造成对类的对象释放时,产生对空指针的释放。详细解说如下:

当使用智能指针,示例

classData

{

private:

    std::shared_ptr<ImageDetection> _pImageDetection;

};

首先,智能指针将类指向的对象与计数器关联。每创建一个类的新对象,引用计数+1(包括拷贝构造函数的使用)。调用析构函数,引用计数减1。当计数器为0时,删除基础对象。所有被创建的新的对象都共享同一指针。

 

而如果利用memmove对类进行拷贝时,示例:

memmove(imgDet, Data._pImageDetection, sizeof(ImageDetection));不会增加计数器的数量。

 

造成的结果是:智能指针使用的实际次数大于计数器的数值。当最后一次调用析构函数时,计数器已经为0,相当于此时析构函数释放空指针,因此会造成程序运行崩溃。

0 0
原创粉丝点击