可以使用 std::shared_ptr
或 QSharedPointer
来实现自动内存管理。以下是两种实现方法的示例代码:
方法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();
}
};
关键特性说明:
- 自动内存管理:当最后一个持有该内存的
CImage
对象被销毁时,智能指针会自动调用删除器释放内存 - 线程安全:两种智能指针都是线程安全的引用计数实现
- 自定义删除器:由于使用
malloc()
分配内存,需要通过自定义删除器使用free()
来释放内存 - 浅拷贝语义:默认的拷贝构造函数和赋值运算符会自动实现共享所有权的浅拷贝
注意事项:
- 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助手提供,问题来源于学员提问