我的看法,欢迎讨论。这其实源于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强大的垃圾回收机制。字符串