2012-07-26 77 views
1

我一直打這個奇怪的std::vector行爲,我不能做任何意義。調整大小的指針向量segfaults

粗略地說,代碼如下

#include <iostream> 
#include <vector> 

class MyClass{ 
public: 
    MyClass(): 
    v_(), 
    w_(init_w()) 
    {}; 

    ~MyClass() 
    {}; 

    std::vector<int*> init_w() 
    { 
    v_.resize(4096); 
    return v_; 
    }; 
private: 
    std::vector<int*> w_; 
    std::vector<int*> v_; 
}; 

int main() 
{ 
    MyClass a; 
} 

運行這給了我在resize壞段錯誤。如果爲resize選擇較低的值,則代碼可能根本不是段錯誤。

更新: 的問題是,相反的是初始化列表表明,w_得到v_之前進行初始化。因此,在init_w(),v_狀態是未定義的。 在聲明中恢復訂單v_w_可修復問題。

+3

請給出一個最小的編譯示例來顯示問題。 – TemplateRex 2012-07-26 18:40:07

+0

@rhalbersma我已經掙扎了好幾個小時,將代碼分解成小而簡單的代碼,但沒有成功。我意識到這個事實很難找到錯誤。 – 2012-07-26 18:43:00

+0

@Nico:不難,不可能。 -1,我很害怕。 – Troubadour 2012-07-26 18:44:08

回答

2

的問題是,相反的是初始化列表表明,你推斷,是案前V_

W_得到初始化,但在現實中卻並非如此。列表的順序不相關;在課堂上申報的順序是。所以,如果你想看看成員實際上是被初始化,你的初始化列表應該模仿聲明順序。

我給你的問題是;你爲什麼要用一個指針向量來開始?在對象超出範圍或遭受內存泄漏之前,您是否意識到需要在列表中排列delete中的每個元素?

+0

的確,這是聲明的順序。有些編譯器甚至警告說,如果項目是以另一個初始化的順序聲明的。我使用指針向量的原因是我使用的庫需要這種格式。特別是,我調用的矢量填充例程有'std :: vector '作爲參數。 – 2012-07-26 23:59:43

+0

這個答案是如何回答問題的? – 2012-07-27 00:00:23

+1

@Nico:嗯,好的,那就小心點吧(那太臭了,但是哦,你可以做的不多。) – 2012-07-27 00:00:58