Сброс объекта класса unique_ptr, порядок уничтожения / строительства - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть вектор unique_ptr для класса ethernet_socket. Если я сбрасываю указатель, я вижу конструктор, вызываемый первым в моих журналах перед деструктором. Правильно ли это, или моя запись буста отстает?

псевдокод

std::vector <boost::movelib::unique_ptr<eth_socket> > _eth_socket_vect;
_eth_socket_vect.resize(1);
_eth_socket_vect.at(0).reset(new eth_socket(host, port, delimiter, timeout, 1));     
// destructor is not called on first reset

// do some operations, then reset

_eth_socket_vect.at(0).reset(new eth_socket(host, port, delimiter, timeout, 1));

// do some more operations on new object

Журналы для второго сброса называются

20-02-28 08:44:14.312702 [info] src/eth_socket.cpp(eth_socket:10) >> started; host_num = 1  <---CONSTRUCTOR
20-02-28 08:44:14.312825 [info] src/eth_socket.cpp(open_eth_socket:67) >> started; host_num = 0
20-02-28 08:44:14.312869 [info] src/eth_socket.cpp(open_eth_socket:71) >> socket_host = 10.0.0.4; socket_port = 1337; host_num = 0
20-02-28 08:44:14.313016 [info] src/eth_socket.cpp(open_eth_socket:104) >> ended; host_num = 0
20-02-28 08:44:14.313054 [info] src/eth_socket.cpp(read_data:247) >> started; host_num = 0
20-02-28 08:44:14.313089 [info] src/eth_socket.cpp(read_data:275) >> ended; host_num = 0
20-02-28 08:44:14.313109 [info] src/eth_socket.cpp(eth_socket:38) >> ended; host_num = 1
20-02-28 08:44:14.313132 [info] src/eth_socket.cpp(~eth_socket:43) >> started; host_num = 0  <-- DESTRUCTOR
20-02-28 08:44:14.313225 [info] src/eth_socket.cpp(close_eth_socket:113) >> started; host_num = 0
20-02-28 08:44:14.313287 [info] src/eth_socket.cpp(socket_read_data_callback:368) >> started; host_num = 0
20-02-28 08:44:14.313299 [info] src/eth_socket.cpp(close_eth_socket:144) >> ended; host_num = 0
20-02-28 08:44:14.313327 [info] src/eth_socket.cpp(~eth_socket:58) >> ended; host_num = 0

1 Ответ

2 голосов
/ 28 февраля 2020

Когда вы изменяете размер vector, его элементы содержат пустое unique_ptr (эквивалентно nullptr):

std::vector <boost::movelib::unique_ptr<eth_socket> > _eth_socket_vect;
_eth_socket_vect.resize(1);

Теперь вы создаете экземпляр eth_socket, поэтому вызывается его конструктор :

_eth_socket_vect.at(0).reset(new eth_socket(host, port, delimiter, timeout, 1));     

Затем вы создаете другой экземпляр и заменяете предыдущий. Итак, сначала вызывается конструктор eth_socket, а затем вызывается деструктор предыдущего экземпляра:

_eth_socket_vect.at(0).reset(new eth_socket(host, port, delimiter, timeout, 1));
...