我的看法,歡迎討論。這其實源於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對應地會釋放掉它。因此它的top
和pop
是分開的,不然會產生懸掛指針。code
回到c庫中爲何沒有itoa
,正是由於庫函數不能幫你申請一塊內存,也就沒法返回一個字符串。你說咱們能夠本身申請內存讓庫函數把字符串寫進去。事實上,sprintf
已經作了這個工做。幸運的是,c++11中增長了to_string
的函數,咱們不再用本身申請內存再用sprintf
了。內存
c++也是同樣,庫函數的返回不能是一個數組(即指針),因此split
以後被分開來的多個字符串就沒法返回。用vector
或者array
是能夠的,但庫中不該該存在這樣的依賴關係,即string不該該依賴vector。而在java中,String.split
返回的正是一個數組(即指針),這依賴於java強大的垃圾回收機制。字符串