通过引用将向量传递给类的构造函数

Pass vector by reference to constructor of class

本文关键字:构造函数 引用 向量      更新时间:2023-10-16

我有一个名为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()时。可能是什么问题?

这是

C++,如果不是绝对需要,请不要使用原始指针。如果目标是在不复制的情况下获得std::vector的所有权,并且您可以使用 C++11,让您的构造函数接受 r 值引用,并赋予它您用 std::move 填充完成的std::vector的唯一所有权,这意味着只有 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的指针,请确保在原始代码中实际分配ptr = &v;。或者new vector,并通过std::shared_ptr管理跨testmain的生命周期。任你挑选。

ptr 未初始化。 你"想要"做的是:

test t(&v);

但是,我认为您更适合在这里引用(毕竟这是您问题的标题! 使用引用避免了不必要的语法(如->超过.(,这只会不必要地阻碍编写代码的阅读。

class test
{
   std::vector<double>& oneVector;
   public:
      test(vector<double>& v) : oneVector(v) {}
       size_t nElem() const { return oneVector.size(); }
};
ptr是一个

未初始化的指针。此不可预测的值将复制到 t.oneVector 。取消引用它是未定义的行为。

您需要指针实际指向有效向量。

你忘了给你的指针所需的值,即向量的地址:

vector<double>* ptr = &v;
//                 ^^^^^^

在代码中,ptr保持未初始化状态,并且程序具有未定义的行为。