这是我的结构载体:
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 :(得分:7)
是否足以在(
)内正确删除包含向量的结构(免费)
没有。 vector
是非平凡的类型,必须使用其构造函数和析构函数正确创建和销毁。你不能简单地分配内存并假装它包含一个(虽然你可以用琐碎的类型,如char
)来做到这一点。一般来说,在C ++中使用malloc
和free
几乎没有充分的理由。
如果您想动态创建一个,可以使用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
也没有必要使用C风格的typedef
(在我看来,即使在C语言中,这也是一个坏主意,特别是如果您使用_player
这样的保留名称作为标记)。类名在C ++中可用作类型名称,因此只需使用常规类定义:
struct player {
...
};
答案 1 :(得分:6)
free()
不与delete
相同。 free()
是C标准库函数,不调用对象的析构函数。 (并且malloc()
不会调用构造函数。)
您需要在此处使用new
和delete
。如果你这样做,是的,mVector
也将分别自动构建和销毁。