2011-02-17 52 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分配足夠的空間,以便插入新元素。