vector指针传入函数的问题

点滴成长路 2013-03-17 12:16:44
//vector指针以参数传入函数无效的问题:
#include <iostream>
#include <vector>
#include <string>
using namespace std;

void test(vector<string> *vec)
{
vec=new vector<string>;
string str="ajfkd";
for (int i=0;i<3;i++)
vec->push_back(str);
vec;
vec;
//函数内部的vec一切正常


}

int main()
{
vector<string> * vec;
test(vec);
vec;
//函数外的指针未知
delete vec;
return 0;

}


...全文
503 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
C++用引用吧
  • 打赏
  • 举报
回复
1楼 2楼都可以。 用标准容器的时候,多用引用。 指针会弄糊涂的。
mujiok2003 2013-03-17
  • 打赏
  • 举报
回复
引用 2 楼 mymtom 的回复:
#include <iostream> #include <vector> #include <string> using namespace std; void test(vector<string> **vec) { (*vec)=new vector<string>; string str="ajfkd"; for (int i=0;i<3;i+……
++.这种时候作为返回值或者引用输出更好
mymtom 2013-03-17
  • 打赏
  • 举报
回复
#include <iostream> #include <vector> #include <string> using namespace std; void test(vector<string> **vec) { (*vec)=new vector<string>; string str="ajfkd"; for (int i=0;i<3;i++) (*vec)->push_back(str); (*vec); (*vec); //函数内部的vec一切正常 } int main() { vector<string> * vec; test(&vec); vec; //函数外的指针未知 delete vec; return 0; }
点滴成长路 2013-03-17
  • 打赏
  • 举报
回复
谢谢楼上的指点。 原来是参数传递那一块没搞清楚。 我把源程序修改了一下,看一下传值和传递引用有什么区别

#include <iostream>
using namespace std;

void test(int *a)
{
	a=new int;
	*a=4;
}

void testRefer(int *&a)
{
	a=new int;
	*a=4;

}

int main()
{
	int *b;
	test(b);
	testRefer(b);
	cout<<*b<<endl;
	return 0;
}
我查了一下汇编代码:

void testRefer(int *&a)
{
01081420  push        ebp  
01081421  mov         ebp,esp  
01081423  sub         esp,0CCh  
01081429  push        ebx  
0108142A  push        esi  
0108142B  push        edi  
0108142C  lea         edi,[ebp-0CCh]  
01081432  mov         ecx,33h  
01081437  mov         eax,0CCCCCCCCh  
0108143C  rep stos    dword ptr es:[edi]  
	a=new int;
0108143E  push        4  
01081440  call        operator new (1081186h)  
01081445  add         esp,4  
01081448  mov         dword ptr [ebp-0C8h],eax  
0108144E  mov         eax,dword ptr [a]  
01081451  mov         ecx,dword ptr [ebp-0C8h]  
01081457  mov         dword ptr [eax],ecx  
	*a=4;
01081459  mov         eax,dword ptr [a]  
0108145C  mov         ecx,dword ptr [eax]  
0108145E  mov         dword ptr [ecx],4  

}
01081464  pop         edi  
01081465  pop         esi  
01081466  pop         ebx  
01081467  add         esp,0CCh  
0108146D  cmp         ebp,esp  
0108146F  call        @ILT+310(__RTC_CheckEsp) (108113Bh)  
01081474  mov         esp,ebp  
01081476  pop         ebp  
01081477  ret  

void test(int *a)
{
010813B0  push        ebp  
010813B1  mov         ebp,esp  
010813B3  sub         esp,0CCh  
010813B9  push        ebx  
010813BA  push        esi  
010813BB  push        edi  
010813BC  lea         edi,[ebp-0CCh]  
010813C2  mov         ecx,33h  
010813C7  mov         eax,0CCCCCCCCh  
010813CC  rep stos    dword ptr es:[edi]  
	a=new int;
010813CE  push        4  
010813D0  call        operator new (1081186h)  
010813D5  add         esp,4  
010813D8  mov         dword ptr [ebp-0C8h],eax  
010813DE  mov         eax,dword ptr [ebp-0C8h]  
010813E4  mov         dword ptr [a],eax  
	*a=4;
010813E7  mov         eax,dword ptr [a]  
010813EA  mov         dword ptr [eax],4  
}
010813F0  pop         edi  
010813F1  pop         esi  
010813F2  pop         ebx  
010813F3  add         esp,0CCh  
010813F9  cmp         ebp,esp  
010813FB  call        @ILT+310(__RTC_CheckEsp) (108113Bh)  
01081400  mov         esp,ebp  
01081402  pop         ebp  
01081403  ret  

test(b);
010835C5  cmp         byte ptr [ebp-0D1h],0  
010835CC  jne         main+3Bh (10835DBh)  
010835CE  push        offset  (1083680h)  
010835D3  call        @ILT+165(__RTC_UninitUse) (10810AAh)  
010835D8  add         esp,4  
010835DB  mov         eax,dword ptr [b]  
010835DE  push        eax  
010835DF  call        test (1081140h)  
010835E4  add         esp,4  
	testRefer(b);
010835E7  mov         byte ptr [ebp-0D1h],1  
010835EE  lea         eax,[b]  
010835F1  push        eax  
010835F2  call        testRefer (10811D6h)  
010835F7  add         esp,4 
原来函数汇编出来的代码完全一样,只是调用时候不一样。 能不能解释一下调用时候他们的区别? 就是下面两段代码的区别:

test(b);
010835C5  cmp         byte ptr [ebp-0D1h],0  
010835CC  jne         main+3Bh (10835DBh)  
010835CE  push        offset  (1083680h)  
010835D3  call        @ILT+165(__RTC_UninitUse) (10810AAh)  
010835D8  add         esp,4  
010835DB  mov         eax,dword ptr [b]  
010835DE  push        eax  
010835DF  call        test (1081140h)  
010835E4  add         esp,4  
	testRefer(b);
010835E7  mov         byte ptr [ebp-0D1h],1  
010835EE  lea         eax,[b]  
010835F1  push        eax  
010835F2  call        testRefer (10811D6h)  
010835F7  add         esp,4 
点滴成长路 2013-03-17
  • 打赏
  • 举报
回复
可是还是没弄清楚为什么指针不行?
stereoMatching 2013-03-17
  • 打赏
  • 举报
回复
引用 6 楼 fucumt 的回复:
大家都建议用引用,是不是这种情况都应该用引用呀? 引用也是一种指针,只不过只能一对一,而指针是一对多。 http://blog.163.com/parklee@yeah/blog/static/64865782200761265977/ 讲的很清楚。 问题一:为什么引用行而指针不行? 问题二:指针不行的原因到底在哪里? 问题三:引用为什么可行,可行的原因在……
因为你的情况不需要pointer的灵活度 引用其实就类似const pointer 例如T *const a 使用reference相较于pointer的优点 : 1 : 使用起来就跟一般的变数一样,不用dereference 2 : 保证有指向某东西,不用检查是不是指向nullptr 3 : 编译器比较容易进行优化 缺点 : 由于指向的地址是固定的,无法指向其他的address 你若不需要指向其他的address,就用reference吧
引用 6 楼 fucumt 的回复:
我觉得还要分析vector的源码,只有从源码入手才能根本解决这个问题。 哪里找vector的源码呀?
你现在需要的不是去读vector的源码 是花时间和心力把c++ primer 5读好 有好好啃过这本书得人不会问这种问题 以你现在对c++的了解 要阅读stl得源码还为之过早
baichi4141 2013-03-17
  • 打赏
  • 举报
回复
函数传参是复制,这是基础知识
意吟 2013-03-17
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
#include <string>
using namespace std;

void test(vector<string> & vec) {
    for (int i=0;i<3;i++) {
        vec.push_back("ajfkd");
    }
}

void show(vector<string> & vec) {
    for (int i=0;i<3;i++) {
        cout << vec[i] << endl;
    }
}

int main()
{
    vector<string> vec;
    test(vec);
    show(vec);
    return 0;
}
点滴成长路 2013-03-17
  • 打赏
  • 举报
回复
大家都建议用引用,是不是这种情况都应该用引用呀? 引用也是一种指针,只不过只能一对一,而指针是一对多。 http://blog.163.com/parklee@yeah/blog/static/64865782200761265977/ 讲的很清楚。 问题一:为什么引用行而指针不行? 问题二:指针不行的原因到底在哪里? 问题三:引用为什么可行,可行的原因在哪里? 其实三个问题跟上来讲都是同一个问题。 我觉得还要分析vector的源码,只有从源码入手才能根本解决这个问题。 哪里找vector的源码呀?

64,648

社区成员

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

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