Tôi sử dụng thư viện bên ngoài hoạt động với số lượng lớn dữ liệu. Dữ liệu được truyền bởi một con trỏ thô, cộng với độ dài. Thư viện không yêu cầu quyền sở hữu của con trỏ, nhưng gọi một hàm gọi lại được cung cấp (với cùng hai đối số) khi nó được thực hiện với dữ liệu.tiếp nhận bộ nhớ từ std :: vector
Dữ liệu được chuẩn bị thuận tiện bằng cách sử dụng std::vector<T>
và tôi không muốn từ bỏ sự tiện lợi này. Sao chép dữ liệu hoàn toàn nằm ngoài câu hỏi. Vì vậy, tôi cần một cách để "tiếp nhận" bộ đệm bộ nhớ thuộc sở hữu của một std::vector<T>
, và (sau này) deallocate nó trong gọi lại.
giải pháp hiện tại của tôi trông như sau:
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);
và, trong hàm callback:
void callback(T * data, size_t size) {
std::allocator<T>().deallocate(data, size);
}
Giải pháp này hoạt động, bởi vì chức năng cấp phát tiêu chuẩn của deallocate
bỏ qua đối số thứ hai của mình (số lượng nguyên tố) và chỉ cần gọi ::operator delete(data)
. Nếu không, những điều xấu có thể xảy ra, vì size
của véc tơ đầu vào có thể hơi nhỏ hơn một chút so với capacity
.
Câu hỏi của tôi là: có cách nào đáng tin cậy (wrt. C++ standard) để tiếp quản bộ đệm std::vector
và phát hành "thủ công" sau một thời gian không?
Bạn sẽ cần phải thực hiện trên toàn bộ vector. –
Sẽ rất tuyệt nếu 'vectơ' có hàm' tách '... nhưng nó không –
@TC: nhưng tôi không có nơi nào để lưu trữ - sản xuất đầu vào và deallocation xảy ra trong hai phần riêng biệt của progam –