LinuxSir.cn,穿越时空的Linuxsir!

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

一个C函数动态返回char *的问题

[复制链接]
发表于 2006-1-9 11:48:49 | 显示全部楼层 |阅读模式
例如这样一个函数
char *itoa(const int integer, int radio)
{
    char *a = new char[2];
    a[0] = 'F';
    a[1] = '\0';

    delete a;  // 问题就在这里

    return a;
}

这里,如果不释放内存的话是一定产生内存泄漏的;
但如果我在返回a前把内存释放掉(虽然返回后的结果是正确的),返回后的结果是不是很可能会出问题呢?

同类型的函数是怎样解决返回值的问题的呢?本人是新手,望高手赐教!
发表于 2006-1-9 11:52:16 | 显示全部楼层
你可以在使用完成之后再释放。
回复 支持 反对

使用道具 举报

发表于 2006-1-9 11:58:57 | 显示全部楼层
我没明白为啥内存都给你释放了还可以返回这个内存中的值
按照unp里的写法,一般都是函数传递,能传指针的都是传指针,这样提高了性能速度也快,也对内存的需求减少。释放内存只需要在使用后释放即可。
回复 支持 反对

使用道具 举报

发表于 2006-1-9 12:05:29 | 显示全部楼层
delete 那一句不但多余而且错误。
返回一个动态分配内存指针不是错误,只要谨记使用后free/delete掉即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-9 13:31:44 | 显示全部楼层
我以前用C的时候,好像记得有一个这样的函数:
char *itoa(int)

那是不是应该要改成:
char *itoa(char *, int)

才对呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-9 13:35:40 | 显示全部楼层
上面的函数好像有一个地方没有人提出的,如果要释放不是应该这样吗:
delete[] a
回复 支持 反对

使用道具 举报

发表于 2006-1-9 14:27:46 | 显示全部楼层
Post by waa
上面的函数好像有一个地方没有人提出的,如果要释放不是应该这样吗:
delete[] a

嗯,确实要这样写。

另外,就算已经free/delete了,也可能可以用的,就像下面这样:

  1. void* test()
  2. {
  3.         void* p = malloc(100);
  4.         free(p);
  5.         return p;
  6. }

  7. int main()
  8. {
  9.         char* p = (char*)test();
  10.         strcpy(p,"hello");
  11.         printf("%s\n",p);
  12. }
复制代码

不过,平时写着玩没事,工程中可千万不能这么写 :)
回复 支持 反对

使用道具 举报

发表于 2006-1-9 16:45:33 | 显示全部楼层
test函数中的p虽然被free,表示p指向的内存被释放,但p的值没有变,如果以前p指向的内存没有被重新使用,返回的p可是返回真确的值。
回复 支持 反对

使用道具 举报

发表于 2006-1-10 11:16:41 | 显示全部楼层
那这样的话,p指向的就是一个不确定的值,这样是很危险的并且是无意义的吧!
照着effective C++书中的说法,偶们应该远离写这种代码的人!:)
回复 支持 反对

使用道具 举报

发表于 2006-1-10 12:13:26 | 显示全部楼层
用linux的都是喜欢玩的,所以,,,,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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