带有指针的C结构,将其包装在unique_ptr中

问题描述 投票:0回答:1

我具有如下所示的存储结构。

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;
c++ unique-ptr
1个回答
0
投票

假设您根本无法更改结构(您应该,如果可以的话),并且只想调用mallocfree而不是newdelete(它们是上等的),则可以执行以下:

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(malloc(sizeof(memoryStruct)); // may have to cast that pointer
    if(!ret) {
        return nullptr;
    }
    ret->memory = static_cast<uint8_t*>(malloc(s*sizeof(uint8_t)));
    if(ret) {
        return ret;
     } else {
         return nullptr;
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.