这样写程序会不会产生内存问题??

guaiwei 2004-11-30 04:28:30
看到一系列源代码,通过一个函数来把整数转换成相应的字符串(这是一个函数),如下:
string toString(const int val)
{
char tmp[20];
snprintf(tmp,20,"%d",val);
return tmp;
}

然后在其他的地方调用toString函数,不知道这样会不会产生内存问题。
temp应该是局部变量,在函数完成后应该被释放,然后把指针返回,这样是不是很危险??
不太明白,请大侠们指教
...全文
94 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
guaiwei 2004-12-01
  • 打赏
  • 举报
回复
谢谢大家的指点,小弟明白了,3x
SwordMan2001 2004-11-30
  • 打赏
  • 举报
回复
这样写是没有问题的.
我举两个例子你就明白了,

1.
char * toString(const int val)
{
char tmp[20];
snprintf(tmp,20,"%d",val);
return tmp;
}

返回char*型,即tmp本身. 这就是所谓的返回一个局部指针. 在函数完成后,tmp被释放了.
如果这时有:
char *str=toString(100);
下面对str的操作显示会引起内存问题.

2.
string toString(const int val)
{
char tmp[20];
string sTmp;
snprintf(tmp,20,"%d",val);
sTmp = string(tmp);
return sTmp;
}
有问题吗?没有. 这只是返回一个普通的变量(而非指针或引用),string的值被拷贝过去,然后所有的局部变量被释放.

楼主看到的toString函数只不过是写法2的一个简便写法而已.类似于
return string(tmp);

明白了吧
248406869 2004-11-30
  • 打赏
  • 举报
回复
回复人: healer_kx(天降甘草) ( ) 信誉:100 2004-11-30 17:04:00 得分: 0


都白话啥啊?

这样写完全正确。!!!

1, VC不烂,你不会用而已,那些warning级别都是可以调整的。
2,返回的是string,不是string&,return是有一个COPY动作的。而不会返回什么栈上的指针和引用。

char数组完全可以返回给string,有隐式“转化”的。
你见过的字符转太少了, BSTR,_bstr_t, 和 LPCTSTR之间的转化更有意思哦。


------------------------------------------------------------------------------------


vc还不烂,你知不知道vc6出来的时候C++标准还没出来,vc对c++标准支持的不好。
我给你写段程序你去编译看看vc6报不报错。
string toString(const int val)
{
char tmp[20];
sprintf(tmp,"%d",val);
return tmp;
}
void f(string &s){}
int main()
{
f(toString(5));
return 0;
}
连错都不报,你到dev c++上去试试肯定报错。
weixiaohua 2004-11-30
  • 打赏
  • 举报
回复
不会~!
函数调用完成tmp占有的内存就自动释放了.
healer_kx 2004-11-30
  • 打赏
  • 举报
回复
都白话啥啊?

这样写完全正确。!!!

1, VC不烂,你不会用而已,那些warning级别都是可以调整的。
2,返回的是string,不是string&,return是有一个COPY动作的。而不会返回什么栈上的指针和引用。

char数组完全可以返回给string,有隐式“转化”的。
你见过的字符转太少了, BSTR,_bstr_t, 和 LPCTSTR之间的转化更有意思哦。
daidodo 2004-11-30
  • 打赏
  • 举报
回复
想错了。由于string有构造函数string(char *),所以返回tmp的时候实际上生成了一个string,这个是全局的,所以即使tmp释放了,程序仍可以工作。
248406869 2004-11-30
  • 打赏
  • 举报
回复
不过你最好还是写成const string toString(const int val),因为你返回的是临时对象。当然不写const也没关系临时对象被看成是const,编译器会给你报错,但你如果用了vc这样的烂编译器,那结果可就......
  • 打赏
  • 举报
回复
不会.
daidodo 2004-11-30
  • 打赏
  • 举报
回复
我觉的你的程序有问题:
string toString(const int val)是string 型的,而tmp是char * 型的,你确认可以return?
yevv 2004-11-30
  • 打赏
  • 举报
回复
刚才不是问了一次了吗 肯定会阿 你在主调函数里引用这个返回值时候就会出问题
248406869 2004-11-30
  • 打赏
  • 举报
回复
不会
candyseason 2004-11-30
  • 打赏
  • 举报
回复
觉得不会

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧