2015-12-30 56 views
-1

我有一个类叫做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()。可能是什么问题呢?

+1

用'-Wall'重新编译,你的编译器会告诉你什么是错的。 –

+0

你认为指针指向什么? – immibis

+0

@immibis没什么。我刚刚意识到这一点。谢谢。 – sodiumnitrate

回答

1

这是C++,如果您不是绝对需要,请不要使用原始指针。如果目标是在不复制的情况下获得std::vector的所有权,并且您可以使用C++ 11,那么使您的构造函数接受r值引用,并赋予它完成std::vector的专有权,您将完成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‘别的地方’,请务必在原始代码中实际分配ptr = &v;。或newvector并管理testmain的使用期限与std::shared_ptr。拿你的选择。

1

你忘了给您的指针的期望值,向量的即地址:

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

在你的代码,ptr仍然未初始化,和你的程序未定义的行为。

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(); } 
}; 
+0

谢谢。我不能相信我错过了这么简单的事情。但是,谢谢你的建议。我试过了,但编译错误时遇到以下错误:没有匹配的构造函数来初始化'test'' – sodiumnitrate

+0

听起来像你没有改变构造函数的签名。 – Chad

2

ptr是一个未初始化的指针。这个不可预知的值被复制到t.oneVector。解引用它是未定义的行为。

你需要你的指针实际指向一个有效的向量。

+0

当您尝试复制指针时,程序已经具有UB(参见[dcl.init]/12)。 –