一、概述
在使用Qt+OpenCV做项目的过程中,发现一个问题。
指针无关联,因为它指向已销毁的实例
产生这个问题的代码如下:
const char* GLSquareWindow::readFileToString(QString resPath) { QFile vertexShaderFile(resPath); if (!vertexShaderFile.open(QIODevice::ReadOnly)) { qDebug() << "Cannot open vertex shader file for reading"; } QString qStr = vertexShaderFile.readAll(); vertexShaderFile.flush(); vertexShaderFile.close(); std::string stdStr = qStr.toStdString(); const char* charStr = stdStr.c_str(); return charStr; }
上述代码想要拿到一个const char* 类型的字符数组。
在其他方法中调用此方法,返回的字符数组是乱码。(浮空指针)
二、解决办法
方法1:
ps:我现在用的
不用这个封装方法,哪里用到就在那里调用。且是分步调用。
QFile vertexShaderFile(":/QtForOpenCV4Tool/shader/square.vert"); if (!vertexShaderFile.open(QIODevice::ReadOnly)) { qDebug() << "Cannot open vertex shader file for reading"; } QString verQStr = vertexShaderFile.readAll(); std::string verStdStr = verQStr.toStdString(); const char* vertexStr = verStdStr.c_str(); //const char* vertexStr = readFileToString(":/QtForOpenCV4Tool/shader/square.vert"); qDebug() << "vertexStr-------------" << vertexStr;
方法2:
还是封装方法,把最后一步
const char* vertexStr = verStdStr.c_str();
自己手动开辟一块内存,存储,使用后可以销毁。
ps:思路是可行了,我做了验证,数据是出来了,但是后面会填充空字符或空格。如果业务不需要精确可以使用。如果业务上必须和文件中的一致则慎用。
标签:vertexStr,销毁,const,C++,char,vertexShaderFile,指针 From: https://www.cnblogs.com/tony-yang-flutter/p/18357422