C庫中沒有itoa以及C++中string沒有split方法的原因

wangdai發表於2019-05-09

個人見解,歡迎討論。這其實源於c/c++需要自己管理記憶體,而一個好的慣例是

自己申請的記憶體要自己釋放掉

所以c/c++庫函式一般都不會返回指標,你會說有些函式返回指標了呀,如

char *strcpy (char * __dest, const char * __src);

但實際返回的是你傳入的__dest,記憶體還是你申請的

另外像一些用c實現的容器會返回指標,比如我們自己實現一個stack可以這樣

typedef struct Stack_T *Stack_T;
void Stack_push(Stack_T stk, void *x);
void *Stack_pop(Stack_T stk);

但事實上pop出來的void *仍然是你自己push進去的,這個stack並不會幫你生成一個*x的copy,它只存你給它的指標而不是實際的變數。所以這個stack只用自己管理自己的記憶體,它的記憶體操作是隱藏在函式內部的,與push和pop對應。

順便說一下c++庫中stack,和上面這個c版本的有點不太一樣,因為c++裡存的是變數的值。它的top會返回一個引用即指標,這個指標對應的記憶體並不是使用者自己申請的,而是在push的時候stack幫你申請的,pop對應地會釋放掉它。所以它的toppop是分開的,否則會產生懸掛指標。

回到c庫中為什麼沒有itoa,正是因為庫函式不能幫你申請一塊記憶體,也就無法返回一個字串。你說我們可以自己申請記憶體讓庫函式把字串寫進去。事實上,sprintf已經做了這個工作。幸運的是,c++11中增加了to_string的函式,我們再也不用自己申請記憶體再用sprintf了。

c++也是一樣,庫函式的返回不能是一個陣列(即指標),所以split之後被分開來的多個字串就無法返回。用vector或者array是可以的,但庫中不應該存在這樣的依賴關係,即string不應該依賴vector。而在java中,String.split返回的正是一個陣列(即指標),這依賴於java強大的垃圾回收機制。

相關文章