2015-10-20 4 views
0

На странице MSDN на GetAcceptExSockaddrs ничего не говорится о высвобождении возвращенных адресных указателей LocalSockaddr и RemoteSockaddr. Попытка освободить их приводит к ошибке, сообщаемой кучей отладки. Поэтому я предполагаю, что это некоторые статические указатели. Но в таком случае кто-нибудь с большим количеством знаний может предоставить некоторую информацию об их жизни? Это обычный действительный до следующего звонка вещь?Срок службы указателей, заполненных GetAcceptExSockaddrs

Чтобы быть более точным - функция заполняет указатели указателями, поэтому это не случай простого перехода в указатели на стек переменных. Рассмотрим этот фрагмент:

INT LocalAddressLength = 0, RemoteAddressLength = 0; 
LPSOCKADDR LocalAddress = nullptr, RemoteAddress = nullptr; 
m_pGetAcceptExSockaddrs(buf, m_nReceiveBufferSize, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, &LocalAddress, &LocalAddressLength, &RemoteAddress, &RemoteAddressLength); 

Функция сама устанавливает указатели вместо того, чтобы просто заполнять их содержимое.

+2

Да? Это _your_ указатели, которые вы должны предоставить для функции записи данных. Вы несете ответственность за их управление. – SingerOfTheFall

+0

@SingerOfTheFall параметры являются указателями на указатели - они заполняются функцией, и если я попробую простой «удалить», я получаю утверждение, поэтому я не думаю, что это тривиально. Я имею в виду - Microsoft обычно указывает, следует ли использовать стандартные механизмы освобождения, или 'CoTaskMemFree' или что-то еще. –

+1

Связанная вами страница говорит, например, «RemoteSockaddr [out] Указатель на структуру sockaddr», что заставляет вас думать о указателях указателей? – SingerOfTheFall

ответ

3

В документации не указано, как освободить память, поскольку вам не нужно освобождать память. В документации написано:

Функция GetAcceptExSockaddrs анализирует данные, полученные при вызове функции AcceptEx, и передает локальные и удаленные адреса в структуру sockaddr.

Это очень плохо сформулировано в моем представлении, но я ожидаю, что это означает, что возвращаемые адреса указывают на то, что внутри поставляемого буфера. Другими словами, никакой новой памяти не было выделено, и адреса, возвращаемые GetAcceptExSockaddrs, действительны, пока введенный буфер действителен.

+0

Я тоже предполагал это, но указатели, заполненные, являются выходными из диапазона предоставленного буфера данных, который был заполнен с помощью 'AcceptEx', поэтому я все же предполагаю, что в функции, которая заполняется этой функцией, есть просто статическая переменная функция и адрес ее помещается в предоставленный указатель, но, к сожалению, у меня нет подтверждения этого. И да, я полностью согласен с тем, что MSDN очень плохо сформулирован в этом случае. –

+0

Ну, это очень странно. Я думаю, вы должны предположить, что вы не должны пытаться освободить эту память. –

+0

Извините, что я ошибся - я не помню, не упустил ли я окно с часами или что-то в этом роде, но после нескольких прогонов кажется, что это правильно - возвращаемые указатели фактически указывают на память внутри буфера, переданную 'AcceptEx' с странным смещение. Благодаря:) –