3MB大小的QByteArray是否应分配在堆上?
问题解答
- Windows平台默认线程栈大小通常为1MB(Visual Studio编译的程序默认配置),你要存储的3MB数据远超栈的默认承载上限,直接在栈上分配这么大的内存块必然触发栈溢出,导致程序崩溃。
- 关于QByteArray的存储逻辑:QByteArray的设计是将实际数据缓冲区分配在堆上,哪怕你在栈上声明QByteArray对象,它内部的字节数据也不会占用栈空间(栈上仅存放QByteArray的少量成员变量,比如指向堆数据的指针、长度值等,体积极小)。因此正确的做法是直接使用QByteArray管理图像数据——调用
resize()预分配对应大小的空间,再通过memcpy()将仪器提供的数据拷贝进去,此时数据会自动存储在堆上,完全无需担心栈溢出问题。 - 如果你之前是手动在栈上开辟大数组(例如
char rawData[3360000];)暂存数据,这种写法务必修改,换成QByteArray或堆分配方式(如std::unique_ptr<char[]>)。
内容的提问来源于stack exchange,提问作者KcFnMi
相关产品推荐
相关产品推荐

