包含向量的自由结构

mac*_*ekm 0 c++ struct vector

这是我的结构包含向量:

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)

Mik*_*our 7

是否足以删除(免费)这个含有向量的结构?

vector是一个非平凡必须创建和销毁正确,使用它的构造和析构型.你不能简单地分配内存并假装它包含一个(虽然你可以用琐碎的类型来做char).在一般情况下,有几乎从来没有一个很好的理由使用mallocfreeC++中.

如果要动态创建一个,可以使用newdelete正确创建和销毁它:

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)


Typ*_*eIA 6

free()一样的delete.free()是一个C标准库函数,不调用对象的析构函数.(并且malloc()不会调用构造函数.)

您需要使用newdelete这里.当你这样做时,是的,mVector也将分别自动构建和销毁.