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强大的垃圾回收机制。字符串

相关文章
相关标签/搜索