c ++ освобождение памяти указателя массива

0

У меня есть функция, как показано ниже

void ReadMyPacket(int Socket)
{
  char *inStartup = new char[2];
  int recvReturn = recv(Socket, inStartup, 2, 0);
  ...
  ...
  delete[] inStartup; 
}

Как я могу освободить память inStartup? Я не могу использовать std :: string, потому что мне нужно передать массив в функцию recv.

  • 2
    Что плохого в том, как у вас это есть? А еще лучше, просто используйте стек, чтобы вам не приходилось об этом беспокоиться.
  • 0
    Вы можете использовать shared_ptr<> если хотите. Умные указатели полезны для вас. Как упомянул @Cyber, в этом нет ничего плохого, если вы не собираетесь делать с ним что-то большее (и скажите нам, что).
Показать ещё 1 комментарий
Теги:

4 ответа

2
Лучший ответ

У вас есть синтаксис справа, однако ваши рассуждения слегка, ошибочны:

Я не могу использовать 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).

  • 0
    Вы можете просто использовать новую функцию std::vector::data() вместо &inStartup.at(0) .
  • 0
    @sjdowling: Хорошо, я постоянно забываю об этом.
2

Динамическое распределение для буфера из 2-х символов является избыточным - просто используйте локальный буфер в стеке:

void ReadMyPacket(int Socket)
{
  char inStartup[2];
  int recvReturn = recv(Socket, inStartup, 2, 0);
  ...
  ...
  // nothing to dispose of here
}
  • 0
    Как это будет работать без постоянного выражения? например, если у меня есть переменная вместо 2
  • 0
    В этом случае вы можете использовать динамическое размещение, но в вашем примере для размера используется жестко запрограммированная константа (2).
1

Этого должно хватить для освобождения памяти.

delete[] inStartup;

Однако, если вы собираетесь содержать его внутри функции и не очень большой, вам лучше использовать стек, это быстрее и не требует освобождения.

char inStartup[2];
0

Это правильно удаляет память.

delete[] inStartup;

вызванный

new []

Ещё вопросы

Сообщество Overcoder
Наверх
Меню