Мне нужно иметь дело с двумя указателями struct addrinfo
. Поскольку я кодирую в C++ (11), я должен сделать код безопасным для кода. Действительно, мои бизнес-структур могут бросить runtime_error
. Если вам больше не нужна такая структура, вы должны позвонить freeaddrinfo
, чтобы освободить список внутри структуры. Пожалуйста, обратите внимание на следующий код:Умные указатели с addrinfo struct
#include <memory>
#include <netdb.h>
class SomeOtherClass
{
public:
SomeOtherClass() : hints(new addrinfo), result(new addrinfo) { /*stuff*/ }
~SomeOtherClass() { freeaddrinfo(result.get()); } // bad things will happen
private:
std::unique_ptr<addrinfo> hints, result;
};
class MyClass : public SomeOtherClass
{
public:
MyClass() { /* hints initialization, call to getaddrinfo, etc. */ }
private:
// ...
};
Мои вопросы:
addrinfo
является "старой" структуры C, без CTOR/dtor позвонить: безопасно использовать новый?getaddrinfo
требует указатель на указатель на структуруaddrinfo
: как передать ее с помощью интеллектуальных указателей?- Как насчет звонка
freeaddrinfo
? Небезопасно удалять (или лучшеfree
) указатель, который удерживает умный указатель.
Для hints
проблем нет, так как его срок службы меньше.
Ну, вы действительно не выделяете результирующие структуры информации о адресах самостоятельно, не так ли? Они выделяются функцией 'getaddrinfo'. И вы можете установить пользовательский делектор для интеллектуальных указателей, который может вызывать 'freeaddrinfo'. И подсказки не нужно выделять динамически, даже если вы собираетесь использовать одну и ту же структуру несколько раз. Просто используйте адрес-оператора для нормальной (не указательной) структурной переменной. –
Этот конструктор [небезопасен] (http://herbsutter.com/gotw/_102/) вы должны использовать 'std :: make_unique', если ваш компилятор поддерживает его, или сделать свой собственный эквивалент, если он этого не делает. Вы действительно не хотите иметь дело с утечками памяти от частичной конструкции. Также, если ваш базовый класс будет удерживать ресурсы, ваш деструктор вашего базового класса должен быть 'virtual' – Mgetz
@Mgetz, это всего лишь фрагмент, который поможет вам разобраться в проблеме. Однако я не могу найти место для 'virtual' dtor, потому что базовый класс не является абстрактным. – edmz