C庫中沒有itoa以及C++中string沒有split方法的緣由

我的看法,歡迎討論。這其實源於c/c++須要本身管理內存,而一個好的慣例是java

本身申請的內存要本身釋放掉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++11

順便說一下c++庫中stack,和上面這個c版本的有點不太同樣,由於c++裏存的是變量的值。它的top會返回一個引用即指針,這個指針對應的內存並非使用者本身申請的,而是在push的時候stack幫你申請的,pop對應地會釋放掉它。因此它的toppop是分開的,不然會產生懸掛指針。code

回到c庫中爲何沒有itoa,正是由於庫函數不能幫你申請一塊內存,也就沒法返回一個字符串。你說咱們能夠本身申請內存讓庫函數把字符串寫進去。事實上,sprintf已經作了這個工做。幸運的是,c++11中增長了to_string的函數,咱們不再用本身申請內存再用sprintf了。內存

c++也是同樣,庫函數的返回不能是一個數組(即指針),因此split以後被分開來的多個字符串就沒法返回。用vector或者array是能夠的,但庫中不該該存在這樣的依賴關係,即string不該該依賴vector。而在java中,String.split返回的正是一個數組(即指針),這依賴於java強大的垃圾回收機制。字符串

相關文章
相關標籤/搜索