none
关于vector存放局部变量问题 RRS feed

  • 问题

  • 为什么局部变量存放到vecotr中,函数返回后仍然存在?

    测试:

    typedef struct A {
    	int a;
    	int b;
    } A_t;
    void AddElement(vector<A_t> &v)
    {
    	for (int i = 0; i < 10; i++)
    	{
    		A_t a;
    		a.a = i;
    		a.b = -i;
    
    		v.push_back(a);
    	}
    }
    int main()
    {
    	vector<A_t> v;
    
    	AddElement(v);
    }

    为什么从AddElement返回后v中仍然有数据,难道是一份拷贝放到v中?

    2017年9月2日 0:42

答案

  • 除非是指针或引用,否则都是要复制的。
    • 已标记为答案 oneonce 2017年9月4日 2:22
    2017年9月2日 8:08
  • Hi oneonce,

    感谢在MSDN论坛发帖。

    >>为什么从AddElement返回后v中仍然有数据,难道是一份拷贝放到v中?

    对象作为函数的参数传递给函数时,其转递方法与传递其他类型的数据一样,可采用值传递和地址传递两种方法。

    1. 值传递:是把对象的拷贝而不是本身传递给函数,函数中对参数对象的任何修改都不会影响调用该函数的对象本身。
    2. 地址传递:调用该函数的对象与参数对象共用同一个地址,所以,函数对参数对象的任何修改都会影响调用该函数的对象本身。

    如果你在AddElement中将其返回的话,返回的也是对象的拷贝。

    希望对你有所帮助。

    Best Regards,

    Sera Yu


    MSDN Community Support<br/> Please remember to click &quot;Mark as Answer&quot; the responses that resolved your issue, and to click &quot;Unmark as Answer&quot; if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact <a href="mailto:MSDNFSF@microsoft.com">MSDNFSF@microsoft.com</a>.

    • 已标记为答案 oneonce 2017年9月4日 2:21
    2017年9月4日 2:06

全部回复

  • 除非是指针或引用,否则都是要复制的。
    • 已标记为答案 oneonce 2017年9月4日 2:22
    2017年9月2日 8:08
  • Hi oneonce,

    感谢在MSDN论坛发帖。

    >>为什么从AddElement返回后v中仍然有数据,难道是一份拷贝放到v中?

    对象作为函数的参数传递给函数时,其转递方法与传递其他类型的数据一样,可采用值传递和地址传递两种方法。

    1. 值传递:是把对象的拷贝而不是本身传递给函数,函数中对参数对象的任何修改都不会影响调用该函数的对象本身。
    2. 地址传递:调用该函数的对象与参数对象共用同一个地址,所以,函数对参数对象的任何修改都会影响调用该函数的对象本身。

    如果你在AddElement中将其返回的话,返回的也是对象的拷贝。

    希望对你有所帮助。

    Best Regards,

    Sera Yu


    MSDN Community Support<br/> Please remember to click &quot;Mark as Answer&quot; the responses that resolved your issue, and to click &quot;Unmark as Answer&quot; if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact <a href="mailto:MSDNFSF@microsoft.com">MSDNFSF@microsoft.com</a>.

    • 已标记为答案 oneonce 2017年9月4日 2:21
    2017年9月4日 2:06