最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt中const?QString轉換?char?*可能的坑

 更新時間:2023年07月25日 10:54:31   作者:Monster_H7  
本文主要介紹了Qt中const?QString轉換?char?*可能的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、遇到的問題

現在有一個這樣的需求,需要將const QString 轉換成  char *

例如:  

const QString q_ip = "192.168.1.1";
const char* kc_ip = q_ip.toStdString().c_str(); //單步調試顯示的結果可能會是'\0'
char* k_ip = const_cast<char*>(kc_ip);

而當我這樣寫時:

std::string str_ip = str.toStdString();
const char* kc_ip = str_ip.c_str();
//kc_ip 是"192.168.1.1" ,printf 輸出也是正常的,不是空

這是由于:

str.toStdString().c_str()中toStdString()是一個臨時std::string變量,而c_str()是指向這個臨時std::string變量的字符串地址,所以傳給c時這個臨時std::string變量已經被析構,其內容是空,c_str()自然就是'\0'。不過這種情況在未知情況下發(fā)生,有時直接寫QString::toStdString().c_str() 也是好用的。

這個函數返回一個與這個QString內容相同的std::string對象。注意這個函數的返回值是一個對象。

二、查閱其他說明

在 C++ 中,函數返回對象一般是類似下面的代碼:

clazz foo() const { clazz c; c.member = 0; return c; }
clazz foo ( ) const
{
     clazz c ;
     c . member = 0 ;
     return c ;
}

注意這里的返回對象,其實是一個臨時對象。在上面代碼中,雖然我們在函數體內創(chuàng)建了一個clazz的對象c,但返回的并不是“這個”對象,而是由 C++ 創(chuàng)建一個臨時對象,再將這個臨時對象返回。注意這里是“臨時對象”,臨時對象是有生命周期的?!禖++ 程序設計語言》第 10 章中寫道,“除非一個臨時對象被約束到某個引用,或者被用于作為命名對象的初始化,否則它將在創(chuàng)建它的那個完整表達式結束時銷毀”。所謂“完整表達式”,是指不是其它表達式的子表達式的表達式。簡單來說,一個完整表達式的標識一般是一個分號。

這句看似繞口的話解釋了之前所有的現象。在第一段代碼中,由于函數返回一個臨時變量,我們立即調用了這個臨時對象的c_str()函數。這一切都沒有問題。之后,完整表達式結束(遇到分號),而這個臨時變量沒有賦值給某個引用或用于給某個對象初始化,所以這個臨時變量被立即銷毀。由此對象獲得的c_str()函數結果同樣被銷毀,因此發(fā)生段錯誤。在第二段代碼中,這個臨時變量用于給sstr對象初始化,我們之后調用的是這個新的被初始化完成的對象的函數,也就是正常的。第三段代碼雖然也沒有賦值給某個引用或用于給某個對象初始化,但在str.toStdString().c_str()語句結束后,表達式并沒有結束,而是繼續(xù)執(zhí)行函數調用。直到函數調用返回,才遇到代表表達式結束的分號,此時臨時變量才會銷毀。而這時候我們已經成功執(zhí)行了函數代碼。所以一切都沒有問題。

這種看似奇怪的現象其實只是一個 C++ 語言的陷阱,甚至與 Qt 沒有一點關系。同樣類似的陷阱還可能發(fā)生在QString::toUtf8()、QString::toAscii()之類的函數身上,值得注意!

到此這篇關于Qt中const QString轉換 char *可能的坑的文章就介紹到這了,更多相關Qt const QString轉換 char *內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言運算符的優(yōu)先級和結合性實例詳解

    C語言運算符的優(yōu)先級和結合性實例詳解

    本文主要介紹C語言運算符的知識,這里對運算符的優(yōu)先級和結合性做出了詳解,并附實例代碼,希望能幫助有需要的小伙伴
    2016-07-07
  • C語言入門篇--變量的左值和右值

    C語言入門篇--變量的左值和右值

    本篇文章是基礎篇,適合c語言剛入門的朋友,本文對初識c語言的指針和指針變量做了簡單的分析,幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • 使用C語言實現最小生成樹求解的簡單方法

    使用C語言實現最小生成樹求解的簡單方法

    這篇文章主要介紹了使用C語言實現最小生成樹求解的簡單方法,包括Prim算法和Kruskal算法的兩種求解方式,需要的朋友可以參考下
    2015-08-08
  • C語言實現通用數據結構之通用鏈表

    C語言實現通用數據結構之通用鏈表

    這篇文章主要為大家詳細介紹了c語言實現通用數據結構之通用鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 詳解C++11中的lambda匿名函數

    詳解C++11中的lambda匿名函數

    匿名函數,簡單地理解就是沒有名稱的函數,又常被稱為 lambda 函數或者 lambda 表達式,這篇文章主要介紹了C++11中的lambda匿名函數,需要的朋友可以參考下
    2022-11-11
  • C語言修煉之路靈根孕育源流出?初識C言大道生上篇

    C語言修煉之路靈根孕育源流出?初識C言大道生上篇

    C語言是一門面向過程、抽象化的通用程序設計語言,廣泛應用于底層開發(fā)。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環(huán)境支持便能運行的高效率程序設計語言
    2022-03-03
  • Qt中TCP協議通信詳解

    Qt中TCP協議通信詳解

    這篇文章主要為大家詳細介紹了Qt中TCP協議通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言關于include順序不同導致編譯結果不同的問題

    C語言關于include順序不同導致編譯結果不同的問題

    這篇文章主要介紹了在日常調試C語言中include的順序不同從而影響最后編譯結果不同的問題,究其原因是寫代碼的習慣所導致,下面跟小編一起來看看吧
    2022-04-04
  • C++面試八股文之智能指針詳解

    C++面試八股文之智能指針詳解

    智能指針是C++11引入的類模板,用于管理資源,行為類似于指針,但不需要手動申請、釋放資源,本文主要為大家介紹了它的相關知識,需要的可以參考一下
    2023-06-06
  • C++模擬實現STL容器vector的示例代碼

    C++模擬實現STL容器vector的示例代碼

    這篇文章主要為大家詳細介紹了C++如何模擬實現STL容器vector的相關資料,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2022-11-11

最新評論

临邑县| 舞阳县| 城固县| 阳山县| 景德镇市| 邻水| 同心县| 同心县| 察雅县| 邵阳县| 绩溪县| 金沙县| 达拉特旗| 兰坪| 莒南县| 泗水县| 田林县| 方城县| 剑川县| 安图县| 珠海市| 镶黄旗| 通化县| 汨罗市| 泽普县| 阳东县| 汨罗市| 湖州市| 赫章县| 石林| 民丰县| 文登市| 登封市| 毕节市| 合山市| 大关县| 荔浦县| 共和县| 额尔古纳市| 铜鼓县| 平原县|