C++ 向量分配问题 #包括“iostream” #包括“向量” 使用名称空间std; 常量向量&Getv() { 向量w(10); w[0]=10; cout
您正在返回对局部变量的引用。当您退出该函数时,它将被销毁 您需要返回一份副本:C++ 向量分配问题 #包括“iostream” #包括“向量” 使用名称空间std; 常量向量&Getv() { 向量w(10); w[0]=10; cout,c++,vector,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: vec
#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
您还应该在include上使用
,因为它们是标准库的一部分。似乎您混淆了返回参数和输入参数。
通过常量引用传递参数是安全的:
const vector<int>& Getv()
{
static vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
void fun(常量向量和arg1)
{
//某物
}
在那个示例中,您只传递引用,所以不会调用复制构造函数
但从函数返回引用值(const或not const)是危险的。
见上面布鲁斯的答案。
您还可以延长引用生存期:
void fun(const vector<int>& arg1)
{
//something
}
const vector&Getv()
{
向量w(10);
w[0]=10;
非常感谢,但是为什么我必须在这里写static,如果我返回一个Student&例如,我不必写它。我的意思是假设我返回的是Student&而不是vector?静态变量不存储在堆栈中,因此在函数结束时它们不会被销毁。那么,返回引用是合法的。如果你返回的是Student&你的学生对象不是静态的,这是未定义的行为。请原谅我,但你所说的未定义的行为是什么意思。你的意思是它是正确的,但我不能这样做。实际上我无法想象它是如何工作的,因为在函数结束时,它在逻辑上会被销毁。但是当我返回学生时,它工作了。非常感谢你……你走吧幸运的是,未定义的行为意味着它可以按您希望的方式工作,但情况并非总是如此。Hani,仅仅因为它这次在您的计算机上运行并不意味着它是正确的。您不能返回对本地堆栈分配对象的引用,因为当函数结束时,它将消失。静态变量位于func之间电话。
void fun(const vector<int>& arg1)
{
//something
}
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();