LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1104|回复: 6

函数返回指针的问题

[复制链接]
发表于 2004-5-16 12:22:38 | 显示全部楼层 |阅读模式
像string类中的c_str()函数,它就返回一个char *指针,但是它所指向的内存空间是在怎么分配的呢?
我猜可以是这样实现:
1.使用new得到的,但是这需要调用c_str()的函数delete这个空间,所以应该不是这样实现的。
2.使用static变量/数组空间,但这不是线程安全的,也应该不是这样的。
3.使用类的数据成员,即这个指针是指向某个数据成员。
对于3.再作如下的讨论:
我自己编了一个类

  1. Date
  2. {
  3. public:
  4.         Date(int year, int month, int day);
  5.         char * c_str(){return m_date;}
  6. private:
  7.         char m_date[16];
  8. };
复制代码

可是在程序中调用strncpy(dest, Date(2004, 5, 16).c_str(), 16);时会出现segment fault.
出现这个错误,我是这样想的:Date(2004,5,16)构造了一个匿名对象,系统为它分配了一段空间, 这个时候m_date是有效的。但是Date(2004,5,16).c_str()返回之后,这个匿名对象就变得无效了,所以它的空间也就被释放了,因而m_date所指向的那段空间也变得无效了。
但是我如果使用strncpy(dest, string("abc").c_str(), 16);这是没问题的。
所以由此看来,使用第3种方法是可能性也不大。

所以我想它是使用了其它的方法,或者是我上面的分析有误。
还请各位指正。
发表于 2004-5-16 20:29:34 | 显示全部楼层
我觉得是返回某个指向成员的常量指针。如果要每次用c_str()都要用分配内存,则第次沿用c_str()时返回的地址应该是不一样的,这与实际情况不符。
string的源代码在/usr/include/c++/3.3.2/basic_string.h中,你可以自己看看。
发表于 2004-5-17 15:29:37 | 显示全部楼层
malloc就可以
得到一块空间将首地址返回并挂到一个指针上,不用时再利用指针将其free掉
 楼主| 发表于 2004-5-17 15:53:53 | 显示全部楼层
最初由 luoyong 发表
malloc就可以
得到一块空间将首地址返回并挂到一个指针上,不用时再利用指针将其free掉


谁来free呢?
caller or callee?
发表于 2004-5-17 19:43:22 | 显示全部楼层
比如

  1. int* afunc()
  2. {
  3.   int *a;
  4.   a=(int *)malloc(12);
  5.   return a;
  6. }
  7. main()
  8. {
  9.   int *int_a;
  10.   int_a=afunc();
  11.   
  12.   free(int_a);
  13. }
复制代码
 楼主| 发表于 2004-5-17 19:53:36 | 显示全部楼层
最初由 luoyong 发表
比如

  1. int* afunc()
  2. {
  3.   int *a;
  4.   a=(int *)malloc(12);
  5.   return a;
  6. }
  7. main()
  8. {
  9.   int *int_a;
  10.   int_a=afunc();
  11.   
  12.   free(int_a);
  13. }
复制代码


这种用法我当然知道了。
但问题是我们在用string.c_str()很返回的指针的时候,根本就不需要delete这个指针。
我想你并没有仔细看我前面的分析。
发表于 2004-5-17 22:12:52 | 显示全部楼层
我觉得kj501说得比较有道理。
用gdb看看返回的指针到底指向哪里,每次返回的是不是一样,也许就能猜到它是怎么做的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表