3 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
#include <iostream>#include <list>#include <string>std::string askForAString(void){ std::string temp; getline(std::cin, temp); return temp; }int main(int argc, char* argv){ std::string password("evlos"); if ( 0 == password.compare(askForAString()) ) { std::cout << "OK" << std::endl; } system("pause"); }

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
char* askForAString(void){ // 這里是申請(qǐng)的全局的動(dòng)態(tài)內(nèi)存 char * temp = (char *)malloc(sizeof(char)*16) //scanf("%s", temp); //fflush(stdin); return temp; }
char password[16] = "evlos";char inputpsw[16]; inputpsw = askForAString(); //這里是第100行if (strcmp(password, inputpsw) == 0) { printf("Allowed!"); }free(inputpsw)

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
第一個(gè)函數(shù)的棧內(nèi)存返回了。
問題不在返回上,問題在分配上。分配內(nèi)存的語句是
char temp[16] = "";
temp數(shù)組是局部變量,局部變量是分配在棧上的。一個(gè)函數(shù)返回時(shí),他的??臻g就會(huì)被釋放了。
要養(yǎng)成良好的內(nèi)存管理習(xí)慣:面向過程的方法中建議,在A方法分配的內(nèi)存就在A方法釋放;面向?qū)ο缶幊讨薪ㄗhA對(duì)象初始化的內(nèi)存由A對(duì)象釋放。
而在第一個(gè)函數(shù)中用malloc分配內(nèi)存(malloc在堆上分配)雖不會(huì)崩潰或者warning,但是不推薦。因?yàn)榈谝粋€(gè)函數(shù)作為內(nèi)存分配者,卻沒能承擔(dān)釋放的責(zé)任(此責(zé)任轉(zhuǎn)交給第二個(gè)函數(shù)了)。如果還有函數(shù)3,函數(shù)4...函數(shù)100調(diào)用函數(shù)1,難道要函數(shù)2至函數(shù)100中都寫個(gè)free(xxx)嗎?如果有函數(shù)10000需要從函數(shù)100中返回字符串呢?工程大了以后,這樣的代碼很難維護(hù)。
我建議:C式編程管理裸奔內(nèi)存,在方法二上分配buffer,buffer指針作為參數(shù)傳遞給方法一。方法二上用完buffer后及時(shí)釋放。
- 3 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報(bào)