Ich benutze eine externe Bibliothek, die auf große Datenmengen arbeitet. Die Daten werden von einem rohen Zeiger plus der Länge übergeben. Die Bibliothek beansprucht nicht den Besitz des Zeigers, sondern ruft eine bereitgestellte Rückruffunktion (mit denselben zwei Argumenten) auf, wenn sie mit den Daten fertig ist.Übernahme von Speicher von Std :: Vektor
Die Daten werden bequem mit std::vector<T>
vorbereitet, und ich möchte lieber nicht auf diesen Komfort verzichten. Das Kopieren der Daten kommt nicht in Frage. Daher muss ich den Speicherpuffer, der einem std::vector<T>
gehört, "übernehmen" und (später) die Zuordnung im Rückruf rückgängig machen.
Meine aktuelle Lösung sieht wie folgt aus:
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);
und in der Callback-Funktion:
void callback(T * data, size_t size) {
std::allocator<T>().deallocate(data, size);
}
Diese Lösung funktioniert, weil der Standard der allocator deallocate
Funktion zweites Argument ignoriert (die Elementzählwert) und ruft einfach ::operator delete(data)
. Wenn dies nicht der Fall ist, können schlimme Dinge passieren, da der size
des Eingabevektors ein wenig kleiner sein kann als sein capacity
.
Meine Frage ist: gibt es eine zuverlässige (wrt. Der C++ Standard) Weise, den Puffer von std::vector
zu übernehmen und es "manuell" zu einem späteren Zeitpunkt freizugeben?
Sie werden über den gesamten Vektor zu nehmen. –
Wäre nett, wenn 'vector' eine' detach' Funktion hätte ... aber es ist nicht –
@TC: aber ich habe keinen Platz es zu speichern - die Eingabe Produktion und Freigabe erfolgt in zwei separaten Teilen des Programms –