free (): неверный указатель на простой держатель буфера unique_ptr - PullRequest
0 голосов
/ 03 августа 2020

Я передаю эту функцию в Rust, который использует ее для выделения буфера и возврата его uint8_t * указателя:

extern "C" uint8_t *cpp_allocate_buffer(size_t size)
{
    uint8_t *buffer = new uint8_t[size];
    return buffer;
}

затем я помещаю этот указатель в эту структуру, что гарантирует его самоудаление, когда оно выходит за рамки:

struct Buffer
{
public:
    std::unique_ptr<uint8_t[]> data;
    size_t len = 0;
    Buffer(CBuffer cBuffer)
    {
        data = std::unique_ptr<uint8_t[]>(cBuffer.data);
        len = cBuffer.len;
    }
    Buffer(bool empty)
    {
        data = std::unique_ptr<uint8_t[]>(nullptr);
        this->len = 0;
        this->empty = empty;
    }

    uint8_t *getData()
    {
        return data.get();
    }
    bool empty = false;
};

ps: CBuffer просто:

   struct CBuffer
    {
        uint8_t *data;
        size_t len;
    };

, поэтому я делаю Buffer b(myCBuffer).

Но я получаю

free(): invalid pointer

сразу после уничтожения shared_ptr, составляющего shared_ptr<Buffer>. Однако проблема возникает только в некоторых ситуациях, возможно, когда разрушение происходит в другом потоке. Я не уверен, потому что не смог изолировать проблему. Что-то не так с тем, как я удаляю этот указатель?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...