2010-12-06 1 views

Antwort

4

Wenn ich verstanden habe, sind Sie immer im Besitz des Puffers 'buf'. Mit synchronen Operationen, wie :: write, können Sie den Puffer löschen, sobald :: write fertig ist. Bei asynchronen Operationen, wie :: async_write, müssen Sie ein asynchrones Abschluss-Token (einen Callback) angeben, das nach Abschluss der Operation aufgerufen wird. Sie könnten den Buf in diesem Callback löschen.

+0

Gute Antwort ++, aber der erste Satz sieht nicht vollständig aus, können Sie ihn in Ihre Bedeutung umformulieren? –

2

Sie haben keinen Zeiger auf den Puffer, den Sie löschen könnten, auch wenn Sie möchten.

Die Eingabedaten von buf werden verwendet, um das Boost.Asio buffer zu erstellen, und dann wird der in dieser Konstruktion verwendete Speicher von der Bibliothek verwaltet. Der Schreibaufruf blockt, bis alle Daten geschrieben sind, also stelle ich mir vor, dass die Daten nicht intern kopiert werden (aber ich bin mir nicht sicher).

Sie sollten natürlich alle erforderlichen Bereinigungen für den Puffer ausführen, den Sie dem Konstruktor (buf) gegeben haben, wenn Sie damit fertig sind.

+0

Die Funktion 'buffer()' erzeugt ein 'mutable_buffer'-Objekt, das intern nur ein Zeiger auf den ursprünglichen Puffer ist. Es wird also kein Speicher kopiert, und der Besitz wird nicht übernommen. – Timo

+0

@Timo - das ist sinnvoll im Rahmen eines blockierenden Anrufs, danke. –