ZBLOG

一个类 CImage 内有一个 uchar * m_imgData 成员,它是通过 malloc() 分配内存的图像数据,CImage 之间的拷贝是浅拷贝,共享 m_imgData 成员的内存空间,如何实现最后一个引用了同一个 m_imgData 的 CImage 实例释放后,m_imgData 自动释放?可以用 std::shared_prt 或 QSharedPointer 实现吗?若可以,请给出两种实现方法的示例代码

可以使用 std::shared_ptrQSharedPointer 来实现自动内存管理。以下是两种实现方法的示例代码:

方法1:使用 std::shared_ptr(C++11标准)

#include <memory>

class CImage {
private:
    std::shared_ptr<uchar> m_imgData; // 使用智能指针管理内存

public:
    // 构造函数:分配指定大小的内存
    explicit CImage(size_t size) {
        m_imgData = std::shared_ptr<uchar>(
            static_cast<uchar*>(malloc(size)),
            [](uchar* ptr) { free(ptr); } // 自定义删除器
        );
    }

    // 默认构造函数(创建空指针)
    CImage() = default;

    // 拷贝构造函数(浅拷贝,共享所有权)
    CImage(const CImage& other) = default;

    // 赋值运算符(浅拷贝,共享所有权)
    CImage& operator=(const CImage& other) = default;

    // 获取原始指针(谨慎使用)
    uchar* data() const {
        return m_imgData.get();
    }

    // 检查是否有效
    bool isValid() const {
        return m_imgData != nullptr;
    }
};

方法2:使用 QSharedPointer(Qt框架)

#include <QSharedPointer>
#include <cstdlib>

class CImage {
private:
    QSharedPointer<uchar> m_imgData; // Qt智能指针

public:
    // 构造函数:分配指定大小的内存
    explicit CImage(size_t size) {
        m_imgData = QSharedPointer<uchar>(
            static_cast<uchar*>(malloc(size)),
            [](uchar* ptr) { free(ptr); } // 自定义删除器
        );
    }

    // 默认构造函数
    CImage() = default;

    // 拷贝构造函数(浅拷贝,共享所有权)
    CImage(const CImage& other) = default;

    // 赋值运算符(浅拷贝,共享所有权)
    CImage& operator=(const CImage& other) = default;

    // 获取原始指针
    uchar* data() const {
        return m_imgData.data();
    }

    // 检查是否有效
    bool isValid() const {
        return !m_imgData.isNull();
    }
};

关键特性说明:

  1. 自动内存管理:当最后一个持有该内存的 CImage 对象被销毁时,智能指针会自动调用删除器释放内存
  2. 线程安全:两种智能指针都是线程安全的引用计数实现
  3. 自定义删除器:由于使用 malloc() 分配内存,需要通过自定义删除器使用 free() 来释放内存
  4. 浅拷贝语义:默认的拷贝构造函数和赋值运算符会自动实现共享所有权的浅拷贝

注意事项:

  • C++17优化:可以使用 std::shared_ptr<void> 避免类型转换:
std::shared_ptr<void> m_imgData;
// 初始化时:
m_imgData = std::shared_ptr<void>(malloc(size), free);
  • Qt版本要求QSharedPointer 的自定义删除器功能需要Qt5及以上版本

这两种方案都能完美解决您描述的内存管理问题,选择哪种取决于您的项目环境(纯C++项目推荐std::shared_ptr,Qt项目推荐QSharedPointer)。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24324

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?