今天在寫(xiě)代碼的時(shí)候發(fā)現(xiàn)了一個(gè)很有意思的錯(cuò)誤,出錯(cuò)的代碼如下。
加入你的電腦里定義了JAVA_HOME這個(gè)環(huán)境變量,你能看出程序的輸出結(jié)果是什么嗎?
1
#include <iostream>
2
#include <assert.h>
3
#include <map>
4
#include <string>
5
6
using namespace std;
7
8
bool GetEnvByKey(string const &strKey, string &strValue)
9

{
10
bool bRet = false;
11
12
assert(!strKey.empty());
13
14
size_t sizeValue = 0;
15
if(0 == getenv_s(&sizeValue, NULL, 0, strKey.c_str()))
16
{
17
strValue.reserve(sizeValue);
18
bRet = (0 == getenv_s(&sizeValue, const_cast<char*>(strValue.c_str()), sizeValue, strKey.c_str()));
19
}
20
21
return bRet;
22
}
23
24
int main( )
25

{
26
string strKey("JAVA_HOME");
27
string strValue;
28
29
if(GetEnvByKey(strKey, strValue))
30
{
31
cout<<strKey<<endl;
32
cout<<strValue<<endl;
33
34
map<string, string> mapEnvInfo;
35
mapEnvInfo.insert(mapEnvInfo.end(), make_pair(strKey, strValue));
36
37
cout<<mapEnvInfo.size()<<endl;
38
cout<<mapEnvInfo.begin()->first<<endl;
39
cout<<mapEnvInfo.begin()->second<<endl;
40
}
41
42
return 0;
43
}
先把你猜想的結(jié)果寫(xiě)出來(lái),然后再把代碼復(fù)制到VC里你試一下,看看到底輸出什么。你猜對(duì)了嗎?是不是輸出結(jié)果有點(diǎn)不太對(duì)?呵呵,經(jīng)過(guò)調(diào)試代碼你發(fā)現(xiàn)錯(cuò)誤了嗎?
錯(cuò)誤就在
strValue.reserve(sizeValue);
bRet = (0 == getenv_s(&sizeValue, const_cast<char*>(strValue.c_str()), sizeValue, strKey.c_str()));
這兩行。
錯(cuò)在這種使用strValue的方式,詳述如下:
strValue.reserve(sizeValue)這句代碼給strValue分配了sizeValue字節(jié)的內(nèi)存,然后getenv_s又把從操作系統(tǒng)里取得的值賦給了strValue所代表的內(nèi)存中,請(qǐng)注意strValue除了有指向字符串的內(nèi)存數(shù)組,還有一個(gè)記錄該字符串中保存的字符數(shù)的一個(gè)變量_Mysize。上面的getenv_s執(zhí)行后只是把字符串給賦值了,但是這個(gè)記錄字符串中字符個(gè)數(shù)的變量卻沒(méi)有賦值。下面的代碼需要使用這個(gè)變量才能進(jìn)行輸出,而此時(shí)這個(gè)變量是0,所以strValue就沒(méi)有輸出。
經(jīng)過(guò)上面的說(shuō)明之后你肯定明白了上述代碼出錯(cuò)的原因。為什么會(huì)出錯(cuò)?是因?yàn)槲覀兪褂胹trValue的時(shí)候把它認(rèn)為成了數(shù)組,所以就出錯(cuò)了。本來(lái)strValue是一個(gè)對(duì)象,它具有各種方法,但是我們的使用方式強(qiáng)迫strValue脫下外衣,強(qiáng)迫它變成赤裸裸的字符串?dāng)?shù)組,這就是問(wèn)題的發(fā)生根源。因此我們使用類(lèi)對(duì)象的時(shí)候一定不能把類(lèi)的外衣脫掉,讓類(lèi)帶來(lái)的好處消失于無(wú)形。
posted on 2010-04-02 22:30
OnTheWay 閱讀(2782)
評(píng)論(9) 編輯 收藏 引用 所屬分類(lèi):
C、C++