我有一个名为test
的类,我希望将大型矢量与百万个元素相关联。我试过通过传递一个指向构造函数的指针来做到这一点:
#include <iostream>
#include <vector>
using namespace std;
class test{
public:
vector<double>* oneVector;
test(vector<double>* v){
oneVector = v;
}
int nElem(){return oneVector->size();}
};
int main(){
vector<double> v(1000000);
cout << v.size() << endl;
vector<double>* ptr;
test t(ptr);
cout << t.nElem()<< endl;
return 0;
}
但是,当我尝试Segmentation Fault:11
时,这会产生t.nElem()
。可能是什么问题?
答案 0 :(得分:3)
这是C ++,如果你不是绝对需要的话,不要使用原始指针。如果目标是在不复制的情况下取得std::vector
的所有权,并且您可以使用C ++ 11,请让您的构造函数接受r值引用,并将其std::vector
的唯一所有权归您所有#39;重新填充std::move
,这意味着只复制vector
个内部指针,而不是数据,避免复制(并保留原始vector
空壳):
class test{
public:
vector<double> oneVector;
test(vector<double>&& v):oneVector(std::move(v)){
}
int nElem(){return oneVector.size();}
};
int main(){
vector<double> v(1000000);
cout << v.size() << endl;
test t(std::move(v));
cout << t.nElem()<< endl;
return 0;
}
如果您确实需要指向vector
&#34;其他地方&#34;的指针,请务必在原始代码中实际指定ptr = &v;
。或new
vector
并使用test
管理main
和std::shared_ptr
的有效期。随便挑选。
答案 1 :(得分:2)
ptr
未初始化。你“想要”做的是:
test t(&v);
但是,我认为你在这里更适合引用(毕竟它是你问题的标题!)。使用引用可以避免不必要的语法(例如->
超过.
),这会不必要地阻碍对所写代码的读取。
class test
{
std::vector<double>& oneVector;
public:
test(vector<double>& v) : oneVector(v) {}
size_t nElem() const { return oneVector.size(); }
};
答案 2 :(得分:2)
ptr
是一个未初始化的指针。此不可预测的值将复制到t.oneVector
。取消引用它是未定义的行为。
你需要指针指向一个有效的向量。
答案 3 :(得分:1)
您忘了给指针指定所需的值,即向量的地址:
vector<double>* ptr = &v;
// ^^^^^^
在您的代码中,ptr
仍然未初始化,并且您的程序有未定义的行为。