gpt4 book ai didi

c++ - 包含 vector 的自由结构

转载 作者:太空宇宙 更新时间:2023-11-04 14:39:21 24 4
gpt4 key购买 nike

这是我的包含 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);

是否足以正确删除(免费)这个内部包含 vector 的结构?

编辑:示例 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;

最佳答案

Is it enough to delete (with free) properly this struct containing vector inside?

没有。 vector 是一种重要 类型,必须使用其构造函数和析构函数正确创建和销毁。您不能简单地分配内存并假装它包含一个内存(尽管您可以使用 trivial 类型(如 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 {
...
};

关于c++ - 包含 vector 的自由结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21170933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com