Я использую внешнюю библиотеку, которая работает с большими объемами данных. Данные передаются с помощью необработанного указателя плюс длина. Библиотека не заявляет права собственности на указатель, но вызывает предоставленную функцию обратного вызова (с теми же двумя аргументами), когда это делается с данными.Получение памяти из std :: vector
Данные получают при помощи 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
функция стандартного Allocator игнорирует его второй аргумент (счетчик элементов) и просто вызывает ::operator delete(data)
. Если это не так, могут произойти плохие вещи, так как size
входного вектора может быть немного меньше его capacity
.
Мой вопрос: есть ли надежный (по стандарту C++) способ взять буфер std::vector
и высвободить его «вручную» через некоторое время?
Вы должны будете взять на себя весь вектор. –
Было бы неплохо, если бы 'vector' имел функцию' detach' ... но это не –
@TC: но мне некуда ее хранить - входное производство и освобождение происходит в двух отдельных частях прогама –