2015-05-19 43 views
1

我有以下工作代碼:Qt的可變生命誤解

QFile file(fileName); 
if(!file.open(QIODevice::ReadOnly)) throw GException(GString("Failed to open file ")); 
QTextStream stream(&file); 

QString s = stream.readAll(); 
QByteArray source = s.toUtf8(); 
const char *string = source.data(); 
glShaderSource(id, 1, &string, NULL); 
glCompileShader(id); 
qDebug() << QString(string); 

如果我刪除QString變量這樣,代碼繼續工作:

QByteArray source = stream.readAll().toUtf8(); 
const char *string = source.data(); 
glShaderSource(id, 1, &string, NULL); 
glCompileShader(id); 
qDebug() << QString(string); 

但是,消除QByteArray原因字符串以指向垃圾:

QString s = stream.readAll(); 
const char *string = s.toUtf8().data(); 
glShaderSource(id, 1, &string, NULL); 
glCompileShader(id); 
qDebug() << QString(string); // GARBAGE HERE 

我找不到信息r在這裏的文檔喜歡這種行爲:http://doc.qt.io/qt-5/qstring.html#toUtf8

我想toUtf8()方法不返回指向內部數組的指針,但創建一個新的。

我是Qt新手,因爲我在文檔中忽略了這一點,所以我不知道將來如何避免類似的問題。

回答

3

QString::toUtf8()返回QByteArray,而不是一個指針。 QString不字符串存儲爲UTF-8 C字符串:

存儲QString的16位QChars,其中每個QChar則對應 一個的Unicode字符4.0的字符串。 (與代碼值的Unicode字符以上 65535使用代理對的,即,兩個連續QChars存儲。)

在該行:

const char *string = s.toUtf8().data(); 

您上的臨時QByteArray使用QByteArray::data(),但作爲的data()的文件說:

的指針保持有效,只要字節數組未重新分配 或destr oyed。

+0

我得到的,非常感謝。當我說'指針'時,我並不是說QByteArray是一個指針,但它包含一個指向數組的指針。無論如何,現在我看到了根本原因。 'toUtf8()'執行轉換,因爲內部編碼不是UTF-8。我沒有想過。 – Grief