读书人

求教下函数返回值为指针的有关问题

发布时间: 2013-09-17 13:35:59 作者: rapoo

求教下函数返回值为指针的问题
西山居的一道笔试题,给定一个接口


vector<char*>*getString(const char page[]
const char begin[]
const char end[]);

把字符串page中位于begin和end直接的串都保存起来,例如
page:abcdefghijk,begin:ab,end:jk;
截取cdefghi放到vector中。
问题1:由于要返回vector的指针,是不是要用new vector?而不能直接用vector a;
问题2:在保存cdefghi的时候是不是应该用char *str=new char[100]而不能直接用char str[100];
3:由于我要把vector传出去,则我就不能在该函数中delete掉,但我传出去的vector在外部能够被delete掉吗?我传的只是一个指针,如果我在外部用了vector<char *> s=getString(...);当我delete s的时候是不是会把我在函数new出来的vector释放掉?

char *str=new char[100];
str="Sender";
char *s1=str;
delete str;
cout<<s1;

s1还是能输出Sender,这说明我释放的只是指针,这个时候我怎么释放掉new 出来的数组呢?
4:想问下各位前辈在什么情况下项目里会这样要求函数返回指针值? c++函数返回值,指针
[解决办法]

1 是的, 必须用new或者malloc, 返回局部变量地址很不安全的!

2 看具体需求,局部需要就不要浪费堆空间了,

3 可以delete的,只要有new出来的首地址就好!本来new出来的空间就是自己管理释放的!

4 很多情况!比如接口函数生成的一些值是接口调用完成后还需要用到有效值的,需要长期保存!
要不从外面传一个地址进来,要不自己new空间出来填充出来的!

[解决办法]
你这个设计不好。
先要考虑好,你返回的是一组指针(或者下标,用来表示在原字符串的位置),还是直接返回另外一个表示结果的字符串(相当于把结果从原串中复制出来)
如果返回指针或者下标,那么事先用个vector<char*>或者vector<int>,传递引用到函数中比较好,避免了在函数中new。
如果返回的是拷贝过来的字符串,那么直接返回string就行,string用于字符串处理比vector更合适。

[解决办法]
引用:
Quote: 引用:


1 是的, 必须用new或者malloc, 返回局部变量地址很不安全的!

2 看具体需求,局部需要就不要浪费堆空间了,

3 可以delete的,只要有new出来的首地址就好!本来new出来的空间就是自己管理释放的!

4 很多情况!比如接口函数生成的一些值是接口调用完成后还需要用到有效值的,需要长期保存!


要不从外面传一个地址进来,要不自己new空间出来填充出来的!


1、既然在外部同样可以释放掉,那么不安全的原因是因为可能调用者并不知道需要释放对吗?
3、那为什么我测试的s1还能够输出呢?不是已经释放掉了吗?是不是在这里计算机已经将该内存设置为空闲,但是没有擦除内存里的内容?
4、既然返回局部变量地址不安全,那么是不是传进来一个vector引用更合适一点,同样也可以长期保存,还有函数参数过多会导致什么后果?栈空间不够?谢谢。


这和stl的实现方式有关。仅就vc++带的那个stl来说,它有自己的内存管理池,你向vector添加的所有元素都是从那个池中分配的,并且释放时也不是真的释放掉,而释放回到stl自己的内存缓冲池里,因为像vector这样的结构,每次添加和删除以及挪动位置,都会频繁导致新的元素的分配释放。为了避免频繁的内存分配释放和分配造成的时间成本,stl把自己做了管理机制。这就是你说的,为啥释放了还能访问,因为对于系统来说,你的那块内存没有真正释放,还是归你应用程序所有,只是暂时由stl保管。但建议你不要使用这个变量,stl不知道啥时候就把它分配出去了。
[解决办法]
其实楼主的问题很简单,这是人家考试的人出的题,就时说:你别管它是否合理。你必须按这个固定接口写。
那么只有一种方案:vector必须在函数里动态分配,然后把指针返回。

读书人网 >C++

热点推荐