gpt4 book ai didi

c++ - 具有指向对象指针的 std::vector 的未指定行为

转载 作者:行者123 更新时间:2023-11-30 03:49:25 26 4
gpt4 key购买 nike

我发现了一个我似乎无法解决的令人伤脑筋的问题。

SceneSettings::SceneSettings()
{
unsigned int w = (ConfigurationManager::GetInstance().GetWidth() >> 1) - 80;
unsigned int h = (ConfigurationManager::GetInstance().GetHeight() >> 1) - 50;

std::vector< std::string > menu_items;

menu_items.push_back("Graphic Settings");
menu_items.push_back("Sound Settings");
menu_items.push_back("Game Settings");
menu_items.push_back("Back");

Label* aux = NULL;
for ( unsigned int i = 0; i < menu_items.size(); i++ )
{
aux = new Label(menu_items[i], w, h);
items.push_back(aux);
aux = NULL;

aux = new Label(menu_items[i], w, h);
aux->SetColor(255, 0, 0);

hover_section.push_back(aux);
hover.push_back(false);

aux = NULL;
h += 25;
}
}

SceneSettings::~SceneSettings()
{
for (unsigned int i = 0; i < items.size(); i++)
{
delete items[i];
delete hover_section[i];
}

items.clear();
hover_section.clear();
}

void SceneSettings::Draw()
{
for ( unsigned int i = 0; i < items.size(); i++ )
{
if (hover[i])
hover_section[i]->Draw();
else
items[i]->Draw();
}
}

void SceneSettings::HandleEvents(SDL_Event& event)
{
switch(event.type)
{
case SDL_MOUSEMOTION :
{
int x = event.motion.x;
int y = event.motion.y;

for ( unsigned int i = 0; i < items.size(); i++ )
hover[i] = items[i]->GetIsInLabel(x, y);
} break;
}
}

现在它所做的是,不显示第一个标签“图形设置”。 (不是不​​可见,只是明显不可见)

项目定义为:

std::vector< Label* > items;
std::vector< Label* > hover_section;
std::vector< bool > hover;

出于某种原因,它不起作用,但是在另一个场景(“main_menu”)中,我有相同的标签 vector (只有标题不同),它工作正常。

现在这个比看起来更有趣。因为它不仅不显示第一个项目,而且即使鼠标完全超出其范围,它也会显示第一个悬停项目。

如果我将 std::vector 替换为 SceneSettings header 中的直接 Label* menu_item_1,它会正确显示。这让我认为它连接到 std::vector

我不太明白的另一件事是,如果我在 Debug模式下运行它并按步骤进行,它会正确显示,但是 watches 和调用堆栈都没有显示任何异常。

感谢任何帮助。

最佳答案

如果您在任何地方按值传递 SceneSettings 对象,无论是作为函数的参数还是返回此类对象,那么您肯定需要考虑在 vector 中使用指针,或者必须实现复制构造函数和复制赋值运算符(如三规则所示)。

编译器创建的默认函数只会进行浅拷贝,即它会拷贝 vector 和指针,它不会创建新的指针(深拷贝)。这会导致您有两个对象都包含指向 vector 中相同对象的指针,如果一个对象被破坏,如果将释放内存,则另一个对象会留下杂散指针,这将导致未定义的行为。

关于c++ - 具有指向对象指针的 std::vector 的未指定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549447/

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