gpt4 book ai didi

C++ - unordered_map 结构内存问题

转载 作者:行者123 更新时间:2023-11-30 02:27:28 25 4
gpt4 key购买 nike

我今天决定将我的代码从 vector 更改为 unordered_map 这样我就可以拥有字符串键值。但是,unordered_map 似乎不太适用。

所以基本上我有一个结构类型:

typedef struct WindowData //the infamous Window Data struct
{
HWND handle;
std::unordered_map<std::string, WindowData*> children;
COLORREF color;
int height;
int width;
int x;
int y;
WindowData *parent;
bool visible;
} windowData;

然后是它的全局定义实例:

WindowData MainWData = {NULL, std::unordered_map<std::string, WindowData*>(), NULL, 0, 0, 0, 0, NULL, true};

然后一个函数将一个元素添加到unordered_list(结构成员children):

void GUI::CreateTitle(WindowData *data) //Home/About page title
{
/*...*/
WindowData wd={handle, std::unordered_map<std::string, WindowData*>(), ColorPalette.BackgroundColor, Nheight, Nwidth, x, y, data, true}; //all these values are defined within the scope of this function except ColorPalette, which is global
data->children.insert(std::make_pair("title", &wd));
}

最后,我有几个其他函数,包括 GUI 类的成员和非成员,它们读取 map 元素,例如这个:

void GUI::CreateAboutButton(WindowData *data) //Home Page About Button
{
/*...*/
int y=data->children.at("title")->y + data->children.at("title")->height + 100;
/*...*/
}

现在,来描述错误。从 GUI::CreateAboutButton() 函数中获取 int y。每次运行程序时,该值都应该相同。通常,它类似于 219。但是,现在,每次运行程序时它都会发生变化。有时 y 是正确的值。其他时候为 0。其他时候大于 40 000。

我知道这是一个内存问题,因为有时当程序运行时,它会立即发出段错误信号,而当它没有发出时,Dr. Memory 会显示两打“未初始化读取”错误。我的猜测是,因为 unordered_map 值必须是指向结构的指针(如果它只是结构值而不是指针,程序将不会编译),一旦结构实例 wd 来自 GUI::CreateTitle() 超出范围, map 仍指向其旧内存位置而不是实际实例。但我不知道如何解决这个问题(这是我第一次实现 unordered_map)。我尝试将 unordered_map::insert 换成 unordered_map::emplace,但这始终导致段错误。

感谢任何帮助。

编辑:下面评论中的诊断/解决方案引导我通过将 wd 定义为类的公共(public)成员来解决问题。现在工作正常,所有内存错误都已解决。

最佳答案

问题在于在 map 中存储指向局部变量 wd 的指针。局部变量在 CreateTitle 结束时被销毁, map 中的指针变为悬空。一种可能的解决方案是让 map 拥有子级 WindowData,例如使用 unique_ptr:

std::unordered_map<std::string, std::unique_ptr<WindowData>> children;

然后就地创建它:

void GUI::CreateTitle(WindowData *data)
{
/*...*/
data->children.emplace(
"title",
make_unique<WindowData>(handle, std::unordered_map<std::string, std::unique_ptr<WindowData>>(), ColorPalette.BackgroundColor, Nheight, Nwidth, x, y, data, true)
);
}

添加编辑:将 wd 定义为 WindowData 的公共(public)成员仅在只有一个 child 时才有效。然而,那么拥有 map 就没有意义了,对吗?

关于C++ - unordered_map 结构内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41734766/

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