свободная структура, содержащая вектор

0

Это мой вектор конструирования структуры:

typedef struct _player 
  {
    char                       id;
    char                       nick[30];
    std::vector<SOCKET>           mVector;
  } player, *PPER_player;

//allocating and freeing part

 lpplayer = (PPER_player) malloc(sizeof(player));
 lpplayer->mVector.push_back(socket1);
 lpplayer->mVector.push_back(socket2);
 ....
 free(lpplayer); 

Достаточно ли достаточно удалить (со свободной) эту структуру, содержащую вектор внутри?

изменение: пример 2

typedef struct player 
  {
    char                       id;
    char                       nick[30];
    std::vector<SOCKET>           mVector;
  } player, *PPER_player;

//allocating and freeing part
  player * lpplayer = new player;
  lpplayer->mVector.push_back(socket1);
  lpplayer->mVector.push_back(socket2);
 ....
 delete lpplayer;     
  • 0
    Ваш код имеет неопределенное поведение 'lpplayer = (PPER_player) malloc (sizeof (player))' из-за выделения C
  • 5
    Смешивать классы C ++ с malloc ? Не делай этого.
Показать ещё 1 комментарий
Теги:
struct
vector

2 ответа

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

free() не совпадает с delete. free() является стандартной библиотечной функцией C и не вызывает деструктор объекта. (И malloc() не вызывает конструктор.)

Вам нужно использовать new и delete здесь. И когда вы это сделаете, да, mVector также будет автоматически сконструирован и разрушен, соответственно.

7

Достаточно ли достаточно удалить (со свободной) эту структуру, содержащую вектор внутри?

Нет. vector - это нетривиальный тип, который должен быть создан и уничтожен должным образом, используя его конструкторы и деструктор. Вы не можете просто выделить память и притвориться, что она содержит одну (хотя вы можете сделать это с помощью тривиальных типов, таких как char). В общем, почти никогда не было веской причины использовать malloc и free в C++.

Если вы хотите создать один динамически, вы можете использовать new и delete для правильного создания и уничтожения:

player * lpplayer = new player;
lpplayer->mVector.push_back(socket1);
...
delete lpplayer;

или, чтобы избежать проблем с удалением его, используйте интеллектуальный указатель

std::unique_ptr<player> lpplayer(new player);
lpplayer->mVector.push_back(socket1);
...
// deleted automatically

или, если у вас нет веской причины для динамического распределения, используйте автоматическую переменную

player lpplayer;
lpplayer.mVector.push_back(socket1);
...
// destroyed automatically

Там также нет необходимости в typedef C-стиля (который, на мой взгляд, является плохой идеей даже в C, особенно если вы используете зарезервированное имя, например _player для тега). Названия классов можно использовать в качестве имен типов в C++, поэтому просто используйте обычное определение класса:

struct player {
    ...
};
  • 0
    Я редактировал мой вопрос. Второй пример в порядке? Я имею в виду, когда я использую New / Delete, мне не нужно беспокоиться о том, что mVector нетривиальна (а также меняет свой размер с помощью push_back перед удалением)?
  • 0
    @maciekm Да, с вашим вторым примером все в порядке (я бы все равно следовал советам в этом ответе о typedef и т. д.) Что касается вектора, конструктор std::vector и функции-члены позаботятся о выделении памяти по мере необходимости, Точно так же это работает, если вы объявляете локальную переменную std::vector . Ничего особенного не нужно.

Ещё вопросы

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