Это мой вектор конструирования структуры:
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;
free()
не совпадает с delete
. free()
является стандартной библиотечной функцией C и не вызывает деструктор объекта. (И malloc()
не вызывает конструктор.)
Вам нужно использовать new
и delete
здесь. И когда вы это сделаете, да, mVector
также будет автоматически сконструирован и разрушен, соответственно.
Достаточно ли достаточно удалить (со свободной) эту структуру, содержащую вектор внутри?
Нет. 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 {
...
};
typedef
и т. д.) Что касается вектора, конструктор std::vector
и функции-члены позаботятся о выделении памяти по мере необходимости, Точно так же это работает, если вы объявляете локальную переменную std::vector
. Ничего особенного не нужно.
malloc
? Не делай этого.