Qt并发运行,通过引用传递值,但内存地址不同
Qt concurrent run, pass value by reference, but the memory address is different?
我使用QtConcurrent::run
运行函数,并通过引用传递值,但值的内存地址不同。
但是如果我通过指针传递值,地址是一样的!我想不明白。我错过什么了吗?
这是代码。
void ptr(QString* s)
{
qDebug() << "pass by ptr: " << s;
}
void ref(QString& s)
{
qDebug() << "pass by ref: " << &s;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str;
QFuture<void> f1 = QtConcurrent::run(ptr, &str);
f1.waitForFinished();
QFuture<void> f2 = QtConcurrent::run(ref, str);
f2.waitForFinished();
qDebug() << "address of str: " << &str;
return a.exec();
}
输出:pass by ptr: 0x28fefc
pass by ref: 0x525de4
address of str: 0x28fefc
QtConcurrent::run
创建您传递给它的所有参数的内部副本。然后,您的线程函数可以访问这些副本,而不是原始参数。通过原始引用传递内容并不会阻止副本的创建。换句话说,QtConcurrent::run
在内部强制按值传递语义。
您在ref
函数中看到的地址是该内部副本的地址。
由于这个原因,如果你特别想访问原始对象,而不是裸引用,你必须使用指针语义或"可复制引用"语义。
如果您想要/需要使用引用,请使用std::ref。新的代码将是:
#include <functional>
...
QFuture<void> f2 = QtConcurrent::run(ref, std::ref(str));
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- 无法将内存地址转换为值
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取 R 数据帧的内存地址
- c++ 编译器是否保护常量内存地址免受任何更改?
- 如何防止矢量的内存地址更改
- cout 打印内存地址而不是值
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- C++在变量的内存地址上做什么来"deallocate"它?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?