это shared_const_buffer
полезно для async_write()
позже, так что я думаю это
должен реализовать какой-то буфер, но я не вижу наследства
подпись. Так что определить begin()
и end()
достаточно?
Буфер, используемый классом shared_const_buffer
, является его _data
членом, a boost::shared_ptr<std::vector<char> >
. Выставления итераторов в буфер достаточно для его использования с async_write()
.
share_const_buffer
имеет data_
общий указатель, но не сам, как
буфер действителен до тех пор, пока async_write()
фактически не записывает данные?
Класс shared_const_buffer
реализует требования типа asio ConstBufferSequence
// Implement the ConstBufferSequence requirements.
typedef boost::asio::const_buffer value_type;
typedef const boost::asio::const_buffer* const_iterator;
const boost::asio::const_buffer* begin() const { return &buffer_; }
const boost::asio::const_buffer* end() const { return &buffer_ + 1; }
поэтому при вызове async_write
оно копируется, в документации прямо указывается следующее:
буферы
Один или несколько буферов, содержащих данные для записи.
Хотя объект буферов может быть скопирован по мере необходимости, право собственности на
базовые блоки памяти сохраняются вызывающей стороной, которая должна
гарантировать, что они остаются действительными, пока не будет вызван обработчик.
Однако исходные данные не копируются, поскольку они сохраняются в shared_ptr
. Это можно увидеть, посыпав несколько операторов отладки
--- reference_counted.cpp 2012-02-19 08:30:32.000000000 -0600
+++ reference_counted_good.cpp 2012-02-19 08:26:27.000000000 -0600
@@ -26,9 +26,7 @@
: data_(new std::vector<char>(data.begin(), data.end())),
buffer_(boost::asio::buffer(*data_))
{
- std::cout << "shared_const_buffer()" << std::endl;
}
- ~shared_const_buffer() { std::cout << "~shared_const_buffer() buffer use count: " << data_.use_count() << std::endl; }
// Implement the ConstBufferSequence requirements.
typedef boost::asio::const_buffer value_type;
@@ -66,7 +64,6 @@
void handle_write()
{
- std::cout << "handle_write" << std::endl;
}
private:
и работает
Sam-Millers-MacBook-Pro:stackoverflow samm$ ./a.out 1234
shared_const_buffer()
~shared_const_buffer() buffer use count: 8
~shared_const_buffer() buffer use count: 7
~shared_const_buffer() buffer use count: 6
~shared_const_buffer() buffer use count: 5
~shared_const_buffer() buffer use count: 4
~shared_const_buffer() buffer use count: 3
~shared_const_buffer() buffer use count: 3
~shared_const_buffer() buffer use count: 2
handle_write
~shared_const_buffer() buffer use count: 2
~shared_const_buffer() buffer use count: 1
в другой оболочке
Sam-Millers-MacBook-Pro:stackoverflow samm$ telnet localhost 1234
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Sun Feb 19 08:22:56 2012
Connection closed by foreign host.
Sam-Millers-MacBook-Pro:stackoverflow samm$
Таким образом, фактический буфер остается действительным до тех пор, пока последний shared_const_buffer
не выйдет из области видимости и не запустит дескриптор