最近我在开发一款基于Qt和C ++的应用程序时遇到了线程/内存问题,现在正在寻找正确的解释。我无法提供完全运行的示例,因为那需要链接到Qt等。但问题可以在几行简短的说明中清楚地解释。
当我在界面上点击一个按钮时,会出现如下情况:
void MainWindow::onClick(){
std::vector<int> vec;
vec.push_back(0);
dev.connect(vec);
// do some more stuff
}
在这个例子中,
dev
是 MainWindow
的成员,是一个代表硬件(或更准确地说,硬件驱动程序)的类类型为 Device
。我想要连接它们。connect
的代码大致如下:void Device::connect(const std::vector<int>& vec){
// do some stuff with vec that takes a long time
}
我遇到的问题是设备驱动程序抛出异常,因为它们从 `vec` 中获取了错误值。事实上,当我打断点进入 `connect` 时,数据已经消失了:在那个作用域中,`vec` 是空的内存。我通过使用 `shared_ptr` 来解决这个问题。
我的理论是,当我从 GUI 线程调用 `dev.connect(vec)` 时,Qt 实际上会将该调用放在一个单独的线程中。然后,该函数需要很长时间,Qt 决定是时候继续完成 `onClick` 了(或者类似的操作,也许立即发生),因此当 `vec` 在 `Device::connect` 中处理时,它已经超出了作用域。考虑到 `shared_ptr` 在这里拯救了一天,这与我的理论相符。
所以我的问题是,我的理论正确吗?有人能解释一下 Qt 的隐式线程行为的详细信息或指向这样的说明吗?
pthread_create
处设置断点)。这是一个类似的关于GTK的问题。 - Basile Starynkevitchmain.cpp
文件中,即可运行它... - Mike