2010-04-29 56 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并寻找其他看似无关的内存问题。