關於QString轉string的堆異常

2021-09-24 22:04:10 字數 935 閱讀 8141

關於qstring轉string的堆異常

ide是基於qt4.7(其他平台暫時沒有測試)。在進行字串轉換時呼叫tostdstring()進行轉換出現了堆異常,**如下:

qstring q_str("hello");

string s_str;

s_str = q_str.tostdstring();

程式執行到這裡就會崩潰,提示說可能是堆被損壞。於是在網上尋找其出現錯誤的原因,然後結合自己的理解分享出來,如果有不對的地方還請解惑。

通過查詢資料發現tostdstring()在進行qstring轉換到string時會構建臨時物件來儲存資料,也就是說tostdstring()返回的時臨時位址,臨時位址只在本行有效,程式往下執行之後就被釋放了。那麼程式提示堆錯誤的原因也就在這裡:可以發現在執行賦值語句之前,s_str物件已經被建立了,它已經被系統分配空間,然後執行下面的賦值語句。string型別的變數在進行賦值時會delete之前的空間,重新new乙個空間。這樣就很好理解了:

s_str = q_str.tostdstring();會執行三個步驟:首先進行delete,然後進行new,最後把資料放到new的記憶體裡。而tostdstring()只是臨時物件,在s_str搬運資料的時候,該位址已經被系統**了,因此s_str訪問的是非法記憶體位址,就會出現堆錯誤資訊了。

基於以上原因,只需要對程式做稍微的修改即可,在建立s_str的建構函式裡進行賦值:

qstring q_str("hello");

string s_str = q_str.tostdstring();

這樣雖然tostdstring()是臨時位址,但是在s_str建構函式裡會建立區域性變數來複製該位址裡的資料,相當於tostdstring()的生命週期延續到s_str建構函式結束的時候,這樣就可以避免上述的bug了。

Qt bool轉QString再轉回bool方法

可能在傳遞引數的過程中,傳的一是個bool值,而後面,在引數的轉換傳遞過程中,只能傳乙個qstring,最後又需要得到乙個bool值,這時就可以使用這種方法 bool testparam qstring tempparam qstring number testparam 上面是bool 轉qstr...

QString 和int,double等的轉換

整形的轉換格式都是一樣的,第乙個引數是十進位制要轉換的整數,第二個引數指定以什麼進製來轉換,預設是十進位制。第二個引數base必須在 2,36 之間,當base為10以外的值時,第乙個引數n將被視為無符號整數。qstring number long n,int base 10 qstring num...

char 位元組陣列 轉QString

char位元組陣列型別轉qstring裡邊要特別注意的是,陣列中含有00時,直接用qstring的方法tolatin1 轉換會出問題,遇到0就認為結束。下面是位元組陣列轉qstring型別的列子 位元組陣列轉16進製制字串,用於16進製制顯示 static qstring tohexstr qbyt...