Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含向量的自由结构_C++_Vector_Struct - Fatal编程技术网

C++ 包含向量的自由结构

C++ 包含向量的自由结构,c++,vector,struct,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)

这是我的结构,包含向量:

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); 
typedef结构\u播放器
{
字符id;
查尔尼克[30];
向量向量向量机;
}玩家,*perp_玩家;
//分配和释放零件
lpplayer=(PPER_player)malloc(sizeof(player));
lpplayer->mVector.向后推(socket1);
lpplayer->mVector.push_back(socket2);
....
免费(lpplayer);
正确删除(使用free)包含向量的结构是否足够

编辑: 例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;     
typedef结构播放器
{
字符id;
查尔尼克[30];
向量向量向量机;
}玩家,*perp_玩家;
//分配和释放零件
玩家*lpplayer=新玩家;
lpplayer->mVector.向后推(socket1);
lpplayer->mVector.push_back(socket2);
....
删除lpplayer;
free()
delete
不同
free()
是C标准库函数,不调用对象的析构函数。(并且
malloc()
不调用构造函数。)

您需要在此处使用
new
delete
。当您这样做时,是的,
mVector
也将分别自动构造和销毁

删除(免费)包含向量的结构是否足够

否。
vector
是一种非常重要的类型,必须使用其构造函数和析构函数正确地创建和销毁它。您不能简单地分配内存并假装它包含一个内存(尽管您可以使用像
char
这样的琐碎类型)。通常,在C++中使用“<代码> MalOC 和<代码>免费< /代码>几乎没有任何充分理由。 如果要动态创建一个,可以使用
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
也不需要C-style
typedef
(在我看来,即使是在C中,这也是个坏主意,尤其是如果您使用像
\u player
这样的保留名称作为标记)。类名称在C++中可用作类型名,所以只需使用常规类定义:

struct player {
    ...
};

您的代码是未定义行为“LpPlayer =(PPELPlayer)MALOC(siZeof(播放器)”,因为C分配C++类与<代码> MALLC/<代码>混合?不要这样做。“typedef struct\u player”是另一个不好的-只是C++中的struct player我编辑了我的问题。第二个例子行吗?我的意思是,当我使用New/Delete时,我不必担心mVector是非平凡的(并且在删除之前通过push_back更改其大小)?@maciekm是的,您的第二个示例是可以的(我仍然会遵循这个答案中关于
typedef
等的建议。)至于向量,
std::vector
构造函数和成员函数将负责根据需要分配内存,这与声明
std::vector
局部变量时的工作方式相同。没有什么特别需要的。
struct player {
    ...
};