代码之家  ›  专栏  ›  技术社区  ›  liv2hak

C结构,指针包装在唯一的\u ptr中

  •  0
  • liv2hak  · 技术社区  · 4 年前

    我有一个内存结构,如下所示。

    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_块,如下所示。我想分配一个大小相同的内存 using malloc 到内存字段并相应地更新大小。

    std::unique_ptr<memoryStruct> m_chunk;
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Remy Lebeau    4 年前

    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);
    
        2
  •  1
  •   Remy Lebeau    4 年前

    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;
        }
    }