C结构,其指针将被包装在unique_ptr中
C struct with a pointer to be wrapped in a unique_ptr
我有一个内存结构,如下所示。
struct memoryStruct {
uint8_t* memory;
size_t size;
};
我的代码要求我在代码中的多个位置调用free(memory)
。为了避免这种情况,我正在考虑将其封装在unique_ptr
中。
我有以下
struct memoryStruct {
uint8_t* memory;
size_t size;
};
struct memoryStructDeleter {
void operator()(memoryStruct* p) const
{
free(p);
}
};
如何初始化m_chunk,如下所示。我想将大小为using malloc
的内存分配给内存字段,并相应地更新大小。
std::unique_ptr<memoryStruct> m_chunk;
您需要这样的东西:
struct memoryStruct {
uint8_t* memory;
size_t size;
};
struct memoryStructDeleter {
void operator()(memoryStruct* p) const
{
if (p) {
free(p->memory);
free(p);
}
}
};
...
std::unique_ptr<memoryStruct, memoryStructDeleter> m_chunk( static_cast<memoryStruct*>(std::malloc(sizeof(memoryStruct))) );
if (m_chunk) {
m_chunk->size = DesiredSize;
m_chunk->memory = static_cast<uint8_t*>(std::malloc(m_chunk->size));
}
如果完全去掉malloc()
,改用new
/new[]
或std::make_unique()
,则可以大大简化:
struct memoryStruct {
std::unique_ptr<uint8_t[]> memory;
size_t size;
memoryStruct(size_t asize = 0) : memory(new uint8_t[asize]), size(asize) {}
// or:
// memoryStruct(size_t asize = 0) : memory(std::make_unique<uint8_t[]>(asize)), size(asize) {}
};
...
std::unique_ptr<memoryStruct> m_chunk(new memoryStruct(DesiredSize));
// or:
// std::unique_ptr<memoryStruct> m_chunk = std::make_unique<memoryStruct>(DesiredSize);
如果使用std::vector
而不是std::unique_ptr
:,则可以进一步简化
struct memoryStruct {
std::vector<uint8_t> memory;
memoryStruct(size_t size = 0) : memory(size) {}
};
...
std::unique_ptr<memoryStruct> m_chunk(new memoryStruct(DesiredSize));
// or:
// std::unique_ptr<memoryStruct> m_chunk = std::make_unique<memoryStruct>(DesiredSize);
假设您根本无法更改结构(如果可以的话,您应该更改(,并且您只想调用malloc
和free
,而不想调用new
和delete
(它们更高级(,则可以执行以下操作:
struct memoryStructDeleter {
void operator()(memoryStruct* p) const
{
if (p) {
if (p->memory) {
free(p->memory);
}
free(p);
}
}
};
std::unique_ptr<memoryStruct, memoryStructDeleter> create(size_t s) {
std::unique_ptr<memoryStruct, memoryStructDeleter> ret(static_cast<memoryStruct*>(malloc(sizeof(memoryStruct))));
if (!ret) {
return nullptr;
}
ret->memory = static_cast<uint8_t*>(malloc(s * sizeof(uint8_t)));
if (ret->memory) {
return ret;
} else {
return nullptr;
}
}
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误