2011-02-17 49 views
2

我有这样一个类:矢量::插入分段错误

classA 
{ 
public: 
    classA() 
    { 
    //Here I am doing something but nothing related to vector 

    } 

    void updateVec(int idx, int value) 
    { 
    //Here, I want to update vector vector based on args passed 
    myVec.insert(myVec.begin() + idx, value); 

    } 

    std::vector<int> myVec; 
} 

现在,我在INSERT语句得到段错误。我需要初始化矢量吗?

+0

我推测,这是一个int整型向量`std :: vector `... – grzkv 2011-02-17 11:18:08

+0

是的,不知何故,它在格式化时被删除。 – user333422 2011-02-17 11:22:32

+0

`updateVec`的哪个参数会使应用程序崩溃?现在你的`vector`中有什么? – Nekresh 2011-02-17 11:26:46

回答

2

从你的代码看来,你没有正确初始化它。

初始化用作局部变量
创建整数的向量,大小3,初始化为0

std::vector<int> myvector (3,0);

的如何初始化(然后调整大小)中的矢量短示例一个类的构造函数

#include <iostream> 
#include <vector> 

class A { 
public: 
    A(int size); 
    ~A(); 
    void updateVec(int idx, int value); 
    void print(); 
private: 
    std::vector<int> myVec; 
}; 

A::A(int size) { 
    myVec.resize(size); 
} 

A::~A() { 
} 

void A::updateVec(int idx, int value) { 
    myVec.insert(myVec.begin() + idx, value); 
} 

void A::print() { 
    std::vector<int>::iterator it; 
    for (it=myVec.begin(); it!=myVec.end(); it++) { 
     std::cout << " " << *it; 
    } 
} 

int main() { 
    A* a = new A(10); 
    a->updateVec(2,10); 
    a->print(); 
} 

这里是文档/ examp关于如何在C++中使用矢量
http://www.cplusplus.com/reference/stl/vector/insert/

+0

您无法以这种方式初始化成员向量。 – Erik 2011-02-17 11:25:47

0

是的,你这样做。向量从空开始。任何尝试访问超过矢量尾部的项目都会导致错误。

为了提出解决方案,我们需要知道该矢量是否需要动态更改大小 - 或者它是否为固定大小,在什么时间点您会知道它需要的大小。另外,如果更新矢量的第17个元素,但当时它只包含10个项目,是否还要创建项目11到16?

3

分段错误意味着您试图访问/写入尚未分配的内存。在你的情况下,根据idx的值,myVec.begin() + idx可以指代超出向量分配区域的内存。插入之前,您需要确保您的矢量至少可以容纳idx元素。 updateVec应该检查矢量的当前大小,如果它不够大,应该调用vector::reserve分配足够的空间,以便插入新元素。