关于函数返回值的问题

ogiso_pest 2011-09-18 09:15:12

#include <iostream>
#include <vector>

using namespace std;

vector<int> *getVector(int end){
vector<int> vec;
for(int i=0; i<end; i++){
vec.push_back(i);
}
cout<<"Size:"<<vec.size()<<endl;
return &vec;
}

int main()
{

vector<int> *v3 = getVector(10);
cout<<"getsize:"<<v3->size()<<endl;
return 0;
}


为啥输出Size:10
getsize:0
怎么得到后大小是0啊?
谢谢了啊
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
翻越寒武 2011-09-18
  • 打赏
  • 举报
回复
vector<int> *去掉*在2005下能返回10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mengmingtao 的回复:]

同楼上,定义的局部变量不能作为返回值,不过不是析构掉,由于数据是在栈里存放,函数出栈时释放空间。
[/Quote]
有没析构不是我说了算,具体看汇编代码

vector<int> *getVector(int end){
010417E0 push ebp
010417E1 mov ebp,esp
010417E3 push 0FFFFFFFFh
010417E5 push offset __ehhandler$?getVector@@YAPAV?$vector@HV?$allocator@H@std@@@std@@H@Z (10477D8h)
010417EA mov eax,dword ptr fs:[00000000h]
010417F0 push eax
010417F1 sub esp,0F4h
010417F7 push ebx
010417F8 push esi
010417F9 push edi
010417FA lea edi,[ebp-100h]
01041800 mov ecx,3Dh
01041805 mov eax,0CCCCCCCCh
0104180A rep stos dword ptr es:[edi]
0104180C mov eax,dword ptr [___security_cookie (104C048h)]
01041811 xor eax,ebp
01041813 push eax
01041814 lea eax,[ebp-0Ch]
01041817 mov dword ptr fs:[00000000h],eax
vector<int> vec;
0104181D lea ecx,[ebp-24h]
01041820 call std::vector<int,std::allocator<int> >::vector<int,std::allocator<int> > (1041032h)
01041825 mov dword ptr [ebp-4],0
for(int i=0; i<end; i++){
0104182C mov dword ptr [i],0
01041833 jmp getVector+5Eh (104183Eh)
01041835 mov eax,dword ptr [i]
01041838 add eax,1
0104183B mov dword ptr [i],eax
0104183E mov eax,dword ptr [i]
01041841 cmp eax,dword ptr [ebp+8]
01041844 jge getVector+74h (1041854h)
vec.push_back(i);
01041846 lea eax,[i]
01041849 push eax
0104184A lea ecx,[ebp-24h]
0104184D call std::vector<int,std::allocator<int> >::push_back (10413CAh)
}
01041852 jmp getVector+55h (1041835h)
cout<<"Size:"<<vec.size()<<endl;
01041854 mov esi,esp
01041856 mov eax,dword ptr [__imp_std::endl (104D35Ch)]
0104185B push eax
0104185C lea ecx,[ebp-24h]
0104185F call std::vector<int,std::allocator<int> >::size (1041244h)
01041864 mov edi,esp
01041866 push eax
01041867 push offset string "Size:" (1049830h)
0104186C mov ecx,dword ptr [__imp_std::cout (104D358h)]
01041872 push ecx
01041873 call std::operator<<<std::char_traits<char> > (1041253h)
01041878 add esp,8
0104187B mov ecx,eax
0104187D call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (104D354h)]
01041883 cmp edi,esp
01041885 call @ILT+720(__RTC_CheckEsp) (10412D5h)
0104188A mov ecx,eax
0104188C call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (104D350h)]
01041892 cmp esi,esp
01041894 call @ILT+720(__RTC_CheckEsp) (10412D5h)
return &vec;
01041899 lea eax,[ebp-24h]
0104189C mov dword ptr [ebp-0FCh],eax
010418A2 mov dword ptr [ebp-4],0FFFFFFFFh
010418A9 lea ecx,[ebp-24h]
010418AC call std::vector<int,std::allocator<int> >::~vector<int,std::allocator<int> > (1041384h) //mark
010418B1 mov eax,dword ptr [ebp-0FCh]
}
imhxb 2011-09-18
  • 打赏
  • 举报
回复
永远不要把一个局部变量的引用作为函数返回值
Jake443403168 2011-09-18
  • 打赏
  • 举报
回复
v3->size()
v3都不是一个对象,只是vector<int>*类型的指针 ,又怎么会有size
mengmingtao 2011-09-18
  • 打赏
  • 举报
回复
同楼上,定义的局部变量不能作为返回值,不过不是析构掉,由于数据是在栈里存放,函数出栈时释放空间。
  • 打赏
  • 举报
回复
vector<int> *getVector(int end){
vector<int> vec;
for(int i=0; i<end; i++){
vec.push_back(i);
}
cout<<"Size:"<<vec.size()<<endl;
return &vec;
}

因为在上面函数里面,vec是个局部变量
在函数结束的时候会析构掉的,
所以你通过这个函数得到的指针是个无效值

建议
vector<int> ×pvec = new vector<int>;

64,654

社区成员

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

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