大神們好,有這么一個成員函式:
char* CppsFile::GetDeleteCmd(QString strFileName)
{
char* cmd = (char*)malloc(sizeof(char)*200);
QString strCmd = QString("rm") + " " + strFileName;
string cstrCmd = strCmd.toStdString();
strcpy(cmd, cstrCmd.c_str());
return cmd;
}
想問一下, 我直接把這個cmd當回傳值 回傳了, 這個指標還需要釋放嗎,如果需要的話,該怎么釋放呢?
uj5u.com熱心網友回復:
在這個函式里不需要釋放在函式的呼叫方,不再使用這個回傳值的時候再釋放
uj5u.com熱心網友回復:
用c++,為何不用share_ptr為何不用string
uj5u.com熱心網友回復:
你在這個函式里釋放了,回傳的就是一個空指標了。用不到的時候及時釋放就行了uj5u.com熱心網友回復:
函式呼叫完后,釋放char * ptr = GetDeleteCmd();
delete ptr;
ptr= nullptr;
uj5u.com熱心網友回復:
樓主已經意識到了,這種設計函式不好的!uj5u.com熱心網友回復:
都已經用了QString了,為啥不干脆點呢?傳個QString的參考進去。void CppsFile::GetDeleteCmd(QString strFileName, QString &out);
樓主這種寫法,以前的c語言的庫好像蠻多的
uj5u.com熱心網友回復:
在這個類CppsFile,增加成員變數指標,指向你分配的記憶體。使用的時候直接取這個變數就可以了。uj5u.com熱心網友回復:
回傳QString即可!QString支持隱式共享,效率還不錯
uj5u.com熱心網友回復:
較早也很直觀的觀念是誰創建誰釋放。【模塊化也方便】所以,一些很基礎的函式像這種都是接受一個記憶體區域,放入自己準備回傳的資料
像大學食堂你是打飯、盛菜阿姨,她只管給你遞上去的碗打飯,你不遞碗可沒的吃。
當然也可以像你著設計一樣,阿姨申請一個盤子【有限的資源】。然后盛飯給你。你吃完了不把盤子放某個地方【釋放它】,而是帶回寢室,或者隨意仍在了某個地方。那食堂的盤子【資源就一直在使用中無法被申請】
uj5u.com熱心網友回復:
1. 對于指標的宣告盡量標明它是個指標,因此建議宣告成char *pCmd;2. 即便malloc了一個記憶體空間,最好要將此空間初始化一下,可以使用memset: memset(cmd, 0x00, sizeof(char)*200);
3. 這個函式定義的沒有問題,只是說釋放記憶體的操作要由呼叫方來完成,只需free cmd即可,并且呼叫方一定要記得釋放,否則就會發生記憶體泄漏。
uj5u.com熱心網友回復:
樓主的編碼習慣很不好1、切記使用malloc的地方就必須使用free進行釋放(快速理解:借的‘’錢(記憶體)‘’記得要還)。
2、引數串列建議使用const QString &strFileName,提升效率。
3、如果成員函式只是構造一條洗掉命令為何不寫一個洗掉函式,這樣功能模塊清晰。
仔細理解下作用域和指標,有時間看看effective c++。
uj5u.com熱心網友回復:
在你這個函式內部不需要釋放,使用完回傳值,確認相關字串不會繼續使用就需要釋放。都2020了,為何不用shared_ptr
uj5u.com熱心網友回復:
在呼叫這個函式地方回傳值使用完了再釋放,不能在這個函式內部釋放,不然就沒回傳值了uj5u.com熱心網友回復:
要的,否則造成記憶體泄漏uj5u.com熱心網友回復:
需要釋放,在函式外面使用完這個回傳值后,你就可以呼叫free來釋放掉這個分配的記憶體空間了。推薦把cmd當做引數傳入函式內來獲取結果,從而代替回傳值回傳,這樣更好
uj5u.com熱心網友回復:
函式回傳QString 型別資料不用搞那么麻煩了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49248.html
標籤:C++ 語言
上一篇:請教前輩,在dev C++下建立一個c專案檔案,出現recipe for target "Project1.exe" failed錯誤
下一篇:求用c#設計 幫做到題
