这是我的结构包含向量:
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);
Run Code Online (Sandbox Code Playgroud)
是否足以删除(免费)这个含有向量的结构?
编辑:示例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;
Run Code Online (Sandbox Code Playgroud)
是否足以删除(免费)这个含有向量的结构?
号vector是一个非平凡必须创建和销毁正确,使用它的构造和析构型.你不能简单地分配内存并假装它包含一个(虽然你可以用琐碎的类型来做char).在一般情况下,有几乎从来没有一个很好的理由使用malloc和freeC++中.
如果要动态创建一个,可以使用new和delete正确创建和销毁它:
player * lpplayer = new player;
lpplayer->mVector.push_back(socket1);
...
delete lpplayer;
Run Code Online (Sandbox Code Playgroud)
或者,为了避免正确删除它的麻烦,请使用智能指针
std::unique_ptr<player> lpplayer(new player);
lpplayer->mVector.push_back(socket1);
...
// deleted automatically
Run Code Online (Sandbox Code Playgroud)
或者,如果您没有充分的理由进行动态分配,请使用自动变量
player lpplayer;
lpplayer.mVector.push_back(socket1);
...
// destroyed automatically
Run Code Online (Sandbox Code Playgroud)
也不需要C风格typedef(在我看来,即使在C语言中也是一个坏主意,特别是如果你使用像_player标签这样的保留名称).类名在C++中可用作类型名称,因此只需使用常规类定义:
struct player {
...
};
Run Code Online (Sandbox Code Playgroud)
free()是不一样的delete.free()是一个C标准库函数,不调用对象的析构函数.(并且malloc()不会调用构造函数.)
您需要使用new和delete这里.当你这样做时,是的,mVector也将分别自动构建和销毁.