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