包含向量的自由结构

时间:2014-01-16 19:21:17

标签: c++ vector struct

这是我的结构载体:

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;     

2 个答案:

答案 0 :(得分:7)

  

是否足以在(

)内正确删除包含向量的结构(免费)

没有。 vector非平凡的类型,必须使用其构造函数和析构函数正确创建和销毁。你不能简单地分配内存并假装它包含一个(虽然你可以用琐碎的类型,如char)来做到这一点。一般来说,在C ++中使用mallocfree几乎没有充分的理由。

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

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()不会调用构造函数。)

您需要在此处使用newdelete。如果你这样做,是的,mVector也将分别自动构建和销毁。