欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt中const?QString轉(zhuǎn)換?char?*可能的坑

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

一、遇到的問題

現(xiàn)在有一個(gè)這樣的需求,需要將const QString 轉(zhuǎn)換成  char *

例如:  

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

而當(dāng)我這樣寫時(shí):

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()是一個(gè)臨時(shí)std::string變量,而c_str()是指向這個(gè)臨時(shí)std::string變量的字符串地址,所以傳給c時(shí)這個(gè)臨時(shí)std::string變量已經(jīng)被析構(gòu),其內(nèi)容是空,c_str()自然就是'\0'。不過這種情況在未知情況下發(fā)生,有時(shí)直接寫QString::toStdString().c_str() 也是好用的。

這個(gè)函數(shù)返回一個(gè)與這個(gè)QString內(nèi)容相同的std::string對(duì)象。注意這個(gè)函數(shù)的返回值是一個(gè)對(duì)象。

二、查閱其他說明

在 C++ 中,函數(shù)返回對(duì)象一般是類似下面的代碼:

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

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

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

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

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

相關(guān)文章

  • C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解

    C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-11-11
  • C語言中操作字符串的函數(shù)詳解

    C語言中操作字符串的函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語言中操作字符串的函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++核心編程之內(nèi)存分區(qū)詳解

    C++核心編程之內(nèi)存分區(qū)詳解

    這篇文章主要為大家詳細(xì)介紹了C++核心編程之內(nèi)存分區(qū),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • MFC對(duì)話框?qū)崿F(xiàn)梯形分頁(yè)

    MFC對(duì)話框?qū)崿F(xiàn)梯形分頁(yè)

    這篇文章主要為大家詳細(xì)介紹了MFC對(duì)話框?qū)崿F(xiàn)梯形分頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C語言的線性表之順序表你了解嗎

    C語言的線性表之順序表你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語言的線性表之順序表,線性表的順序表示指的是用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表中的數(shù)據(jù)元素,本文具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++基礎(chǔ)入門教程(五):new和delete

    C++基礎(chǔ)入門教程(五):new和delete

    這篇文章主要介紹了C++基礎(chǔ)入門教程(五):new和delete,本文講解了動(dòng)態(tài)分配內(nèi)存、new和delete的配對(duì)、new、delete與reatin、release的關(guān)系、動(dòng)態(tài)數(shù)組等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • C++容器適配器的概念與示例

    C++容器適配器的概念與示例

    C++?STL(標(biāo)準(zhǔn)模板庫(kù))是一套功能強(qiáng)大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實(shí)現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊(duì)列、棧,今天我們來探究一下stl容器適配器的使用吧
    2023-01-01
  • C語言使用openSSL庫(kù)AES模塊實(shí)現(xiàn)加密功能詳解

    C語言使用openSSL庫(kù)AES模塊實(shí)現(xiàn)加密功能詳解

    這篇文章主要介紹了C語言使用openSSL庫(kù)AES模塊實(shí)現(xiàn)加密功能,詳細(xì)分析了C語言加密的相關(guān)概念、原理及AES模塊加密具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C++入門之vector使用詳解

    C++入門之vector使用詳解

    這篇文章主要為大家介紹了C++入門之vector使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C語言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄

    C語言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論