2010-04-29 53 views
7

我創建了一個結構來保存一些數據,然後聲明一個向量來保存該結構。向量上的段錯誤<struct>

但是,當我做一個push_back我得到該死的段錯誤,我不知道爲什麼!

我的結構是定義爲:

typedef struct Group 
{ 
    int codigo; 
    string name; 
    int deleted; 
    int printers; 
    int subpage; 

    /*included this when it started segfaulting*/ 
    Group(){ name.reserve(MAX_PRODUCT_LONG_NAME); } 
    ~Group(){ name.clear(); } 
    Group(const Group &b) 
    { 
    codigo = b.codigo; 
    name = b.name; 
    deleted = b.deleted; 
    printers = b.printers; 
    subpage = b.subpage; 
    } 
    /*end of new stuff*/ 
}; 

本來,結構並沒有複製,構造函數和析構函數。當我在下面閱讀這篇文章時我加了後者。

Seg fault after is item pushed onto STL container

但最終的結果是相同的。

有一件事讓我心煩意亂!當我第一次將一些數據推入矢量中時,一切都很順利。稍後在代碼中,當我嘗試將更多數據推送到矢量中時,我的應用程序只是段錯誤!

矢量聲明

vector<Group> Groups 

,並且可供我使用它的文件中的全局變量。沒有實習醫生其他地方,等...

我可以跟蹤誤差:

_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage- this->_M_impl._M_start); 

時,我完成添加/複製到向量的最後一個元素vector.tcc ....

據我所知。我不應該需要任何與拷貝構造函數有關的事情,因爲淺拷貝應該足夠了。我甚至沒有分配任何空間(但我爲這個字符串做了一個預備試驗)。

我不知道是什麼問題!

我對openSUSE 10.2的運行此代碼用gcc 4.1.2

我不是真的要急於升級,因爲向後兼容性問題GCC ...

此代碼工作「完美」在我的Windows機器上。我編譯它與海灣合作委員會3.4.5 mingw沒有任何問題...

幫助!

--- ... ---

:::編輯:::

我推數據

Group tmp_grp; 

(...) 

tmp_grp.name = "Nova "; 
tmp_grp.codigo=GetGroupnextcode(); 
tmp_grp.deleted=0; 
tmp_grp.printers=0; 
tmp_grp.subpage=0; 
Groups.push_back(tmp_grp); 
+1

證明推動它請的代碼。 – 2010-04-29 17:20:17

+1

你的struct dos不需要拷貝構造函數,並且提供它不是個好主意 - 默認的拷貝構造函數完成你所需要的一切。你也不需要結構上的typedef。它也不需要析構函數,也可能不需要構造函數。 – 2010-04-29 17:22:14

+0

@Neil。我知道!我把它們加入了「絕望」 – 2010-04-29 17:28:41

回答

0

那麼...

valgrind救援!在valgrind日誌中告訴我的是這件作品。

Invalid write of size 4 
==4639== at 0x805BDC0: ChangeGroups() (articles.cpp:405) 
==4639== by 0x80AC008: GeneralConfigChange() (config.cpp:4474) 
==4639== by 0x80EE28C: teste() (main.cpp:2259) 
==4639== by 0x80EEBB3: main (main.cpp:2516) 

在文件中的這一點上我是做這個

Groups[oldselected].subpage=SL.selected_code(); 

,如果什麼oldselected是矢量的範圍之外?

在這種情況下發生了什麼事是oldselected可能是-1 ...雖然這在這一點上並沒有崩潰,這是寫的東西別的地方...

我也許應該開始使用在()運算符處檢查異常,或只檢查「oldselected」是否大於0並且< Groups.size()[首選解決方案]。

所以對約翰和喬什的感謝讓我想起了valgrind。

我以前用過它,但從不需要做任何重要的事情(幸運的是:D)。

有趣的是,在Windows中我沒有得到這個段錯誤。問題是一樣的......我想這與內存管理和編譯器有關......它真的沒有我。

感謝大家的輸入;)

乾杯

1

你一定要刪除析構函數。 C++將自動調用所有數據成員的析構函數,並且對已經具有這樣的析構函數的成員執行操作是不必要的,並且可能不安全。

但是,我沒有看到你的代碼本身有什麼問題。你將不得不發佈一點點。嘗試展開(...)部分 - 向我們展示涉及該向量的所有代碼。

6

像尼爾說,你並不需要一個默認構造函數,拷貝構造函數或析構函數:

  • std::string後自己清理,所以你的析構函數從來都不是必要的。
  • 編譯器提供的淺拷貝構造函數可以正常工作。
  • std::string::reserve是不必要的,因爲std::string會根據需要動態分配內存,但它可能會提供性能優勢。

您發佈的代碼看起來是正確的(它看起來非常簡單直接,因此很難看到錯誤會在哪裏蔓延)。因此,我懷疑你在代碼中的其他地方破壞了內存,並且vector<Group>只是受害者。

嘗試安裝Valgrind(OpenSuse當中應該爲它提供一個包),並通過它運行應用程序(在命令行中,只運行valgrind my-app),看看是否能Valgrind的捕捉任何內存損壞。

1

像這樣的內存錯誤可能是由於刪除同一內存兩次或刪除您從新獲得的內存而導致的。這種錯誤經常發生在像這樣的地方。由於DeadMG已經聲明安裝valgrind並尋找其他看似無關的內存問題。