我使用一个操作大量数据的外部库。该数据通过原始指针和长度传入。该库不声明指针的所有权,但在完成数据操作时调用提供的回调函数(带有相同的两个参数)。
使用std::vector<T>
可以方便地准备数据,而我不想放弃这种便利性。完全不可能复制数据。因此,我需要一种方法来“接管”由std::vector<T>
拥有的内存缓冲区,并在回调中释放它。
我的当前解决方案如下:
std::vector<T> input = prepare_input();
T * data = input.data();
size_t size = input.size();
// move the vector to "raw" storage, to prevent deallocation
alignas(std::vector<T>) char temp[sizeof(std::vector<T>)];
new (temp) std::vector<T>(std::move(input));
// invoke the library
lib::startProcesing(data, size);
并且,在回调函数中:
void callback(T * data, size_t size) {
std::allocator<T>().deallocate(data, size);
}
这个解决方案可行,因为标准分配器的
deallocate
函数忽略了它的第二个参数(元素计数),并简单地调用::operator delete(data)
。如果没有这样做,可能会发生糟糕的事情,因为输入向量的size
可能比其capacity
小得多。我的问题是:是否有一种可靠(就C++标准而言)的方法来接管
std::vector
的缓冲区,并在以后的某个时间手动释放它?
vector
有一个detach
函数会很好...但它没有。 - M.Munique_ptr<vector<T>> temp(new vector<T>(move(input)));
?此外,您的解决方案仅适用于T
是可平凡析构类型,否则您需要在每个元素上调用allocator<T>::destroy
。回答您的问题,没有简单的方法可以接管来自vector
的内存,您可能可以使用自定义分配器完成某些操作,但我建议仍然坚持当前的解决方案。 - Praetorianvoid (*callback)(T * data, size_t size, void * user_data)
并且startProcessing(T* data, size_t size, void * userdata)
,你就有了通向解决方案的简单途径。 - Michael Anderson