У меня есть функция, как показано ниже
void ReadMyPacket(int Socket)
{
char *inStartup = new char[2];
int recvReturn = recv(Socket, inStartup, 2, 0);
...
...
delete[] inStartup;
}
Как я могу освободить память inStartup? Я не могу использовать std :: string, потому что мне нужно передать массив в функцию recv.
У вас есть синтаксис справа, однако ваши рассуждения слегка, ошибочны:
Я не могу использовать
std::string
потому что мне нужно передать массив в функциюrecv
.
Хотя string
возможно, не является правильным интерфейсом, vector
определенно есть. Основной причиной того, что vector
является смежным массивом, является совместимость с C.
Таким образом, вы можете написать:
void ReadMyPacket(int Socket)
{
std::vector<char> inStartup(2);
int recvReturn = recv(Socket, &inStartup.at(0), inStartup.size(), 0);
//...
//...
}
И таким образом вы избегаете риска забыть о вызове delete[]
самостоятельно (например, в случае исключения).
Примечание: в С++ 11 и выше вы можете использовать inStartup.data()
вместо &inStartup.at(0)
.
std::vector::data()
вместо &inStartup.at(0)
.
Динамическое распределение для буфера из 2-х символов является избыточным - просто используйте локальный буфер в стеке:
void ReadMyPacket(int Socket)
{
char inStartup[2];
int recvReturn = recv(Socket, inStartup, 2, 0);
...
...
// nothing to dispose of here
}
Этого должно хватить для освобождения памяти.
delete[] inStartup;
Однако, если вы собираетесь содержать его внутри функции и не очень большой, вам лучше использовать стек, это быстрее и не требует освобождения.
char inStartup[2];
Это правильно удаляет память.
delete[] inStartup;
вызванный
new []
shared_ptr<>
если хотите. Умные указатели полезны для вас. Как упомянул @Cyber, в этом нет ничего плохого, если вы не собираетесь делать с ним что-то большее (и скажите нам, что).