gpt4 book ai didi

c++ - 使 QMap 中的指针值无效

转载 作者:太空宇宙 更新时间:2023-11-04 16:23:34 25 4
gpt4 key购买 nike

我遇到了一个看起来很奇怪的问题,但这可能是 QMap 工作方式的一个怪癖,我就是不明白。很难总结问题,但我会尽力而为。

我有一个类A , 与 QMap<QString, someType*> mySomeTypeMap; .当我在我的程序中加载一个新文件时,我想删除这个 QMap 的所有内容所以我可以用新数据重新填充它。我通过执行以下操作来做到这一点:

foreach (QString key, mySomeTypeMap.keys())
{
someType* toDelete = mySomeTypeMap.take(key);

//Show me the original address of the pointer
qDebug() << "toDelete: " << toDelete;

delete toDelete;

//Set the pointer to 0x0
toDelete = NULL;
}

qDebug()语句打印出我要删除的值的正确地址,当我查看 toDelete 时在调试器中设置为 NULL ,它说 0x0,这就是我想要的。

然后,在不同的类(class)B , 我有以下代码...

void B::setSomeType(someType* blah)
{
if (Blah != NULL)
{
//Calls a bunch of disconnect()'s
disconnectAllSignals();

Blah = blah;

//Calls a bunch of connect()'s
connectAllSignals();
}
}

现在,真正令人困惑的是我的程序在到达 disconnectAllSignals(); 时崩溃了。线。原因是它试图调用 disconnect()Blah当我将它设置为 NULL 时,它已被删除并且应该设置为 0x0 .但是,如果它实际上设置为 NULL它一开始就不会进入那个 if block 。在调试器中,我看到 Blah 的地址和我打印出的完全一样 qDebug() << "toDelete: " << toDelete;就在设置 toDelete = NULL; 之前.

TLDR;我不知道我的程序如何在删除指针并将同一指针设置为 NULL 后取回指针的原始地址。 .由于指针未设置为 NULL稍后在执行过程中会导致崩溃。

最佳答案

映射中的值按值存储,即使在这些情况下这意味着指针(它指向的地址)按值存储。例如:

someType* toDelete1 = mySomeTypeMap.take(key);
someType* toDelete2 = mySomeTypeMap.take(key);
someType* toDelete3 = toDelete1;
toDelete1 = NULL;

toDelete2 & toDelete3 仍会指向原来的对象

与其在删除后使指针为空,不如将其从映射中删除或将该键的值设置为 NULL。

关于c++ - 使 QMap 中的指针值无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14340672/

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