矢量分配问题

时间:2009-10-15 18:46:21

标签: c++ vector

#include "iostream"
#include "vector"
using namespace std;

const vector<int>& Getv() 
{
vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
//Now when I write in main:
vector<int>v = Getv();//Throws exception
//and the below rows has no effect
vector<int>v;
v=Getv()//w does not change
请问有什么问题?
Hani Almousli ......

2 个答案:

答案 0 :(得分:9)

您正在返回对局部变量的引用。退出该功能时,它会被破坏。

您需要返回一份副本:

vector<int> Getv() 
{
  vector<int> w(10);
  w[0]=10;
  cout<<w.size()<<endl;
  return w;
}

或者你可以让w静态:

const vector<int>& Getv() 
{
  static vector<int> w(10);
  w[0]=10;
  cout<<w.size()<<endl;
  return w;
}

此外,您应该在包含中使用<>,因为它们是标准库的一部分。

答案 1 :(得分:1)

似乎你混淆了return参数和输入参数。 通过常量引用传递参数是安全的:

void fun(const vector<int>& arg1)
{
    //something
}

在该示例中,您只传递引用,因此不会调用复制构造函数。

但是从函数返回引用值(const或not const)是危险的。 见上面布鲁斯的回答。 您还可以延长参考生命周期:

const vector<int>& Getv() 
{
    vector<int> w(10);
    w[0]=10;
    cout<<w.size()<<endl;
    return w;
}

const vector<int>& v = Getv(); //now all ok

但我不这样推荐。它可能是未来错误的来源。 最好的方法是返回向量的值。

vector<int> Getv() 
{
   vector<int> w(10);
   w[0]=10;
   cout<<w.size()<<endl;
   return w;
}

vector<int>v = Getv();

由于只有1个return语句,因此您可以考虑RVO,也不会调用复制构造函数。它快速而安全。