在vector <struct> </struct>上的segfault

时间:2010-04-29 17:15:49

标签: c++ linux vector 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*/
 };

最初,struct没有copy,constructor或析构函数。当我在下面阅读这篇文章时,我将它们添加到后面。

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中

....

据我所知。我不需要与复制构造函数有任何关系,因为浅拷贝应该足够了。我甚至没有分配任何空间(但我为字符串做了预备尝试)。

我不知道问题是什么!

我正在使用gcc 4.1.2

在OpenSuse 10.2上运行此代码

由于向后兼容性问题,我并不急于升级gcc ......

此代码在我的Windows机器上“完美”工作。我用gcc 3.4.5 mingw编译它没有任何问题...

帮助!

--- ...... ---

::: EDIT :::

我推送数据

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);

4 个答案:

答案 0 :(得分:6)

像Neil所说,你不需要默认的构造函数,复制构造函数或析构函数:

  • std::string自行清理,所以你的析构函数永远不需要。
  • 编译器提供的浅拷贝构造函数可以正常工作。
  • std::string::reserve是不必要的,因为std::string会根据需要动态分配内存,但可能会提供性能优势。

您发布的代码看起来是正确的(它看起来非常简单和直接,因此很难看出错误可能在哪里蔓延)。因此,我怀疑你在代码中的其他地方破坏了内存,vector<Group>只是受害者。

尝试安装Valgrind(OpenSuse应为它提供一个包)并通过它运行您的应用程序(从命令行运行valgrind my-app)以查看Valgrind是否可以捕获任何内存损坏。< / p>

答案 1 :(得分:1)

你绝对应该删除析构函数。 C ++将自动调用所有数据成员的析构函数,并且对已经有类似析构函数的成员执行操作是不必要的,并且可能不安全。

但是,我认为你的代码没有任何问题。你将不得不发布一点。尝试扩展(...)部分 - 向我们展示涉及向量的所有代码。

答案 2 :(得分:1)

这样的内存错误可能是因为删除了两次相同的内存或删除了没有从new中获取的内存。这些错误经常发生在像这样的地方很久之后。正如DeadMG已经声明安装valgrind并寻找其他看似无关的内存问题。

答案 3 :(得分: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在vector的边界之外怎么办?

在这种情况下发生的事情是,旧的选择可能是-1 ......虽然此时没有崩溃,但它正在其他地方写一些东西......

我应该开始使用at()运算符并检查异常,或者只检查“oldselected”是否>&0;&lt; Groups.size()[首选解决方案]。

对John和Josh提醒我valgrind非常感谢。

我之前使用过它,但从来没有需要做任何重要的事情(幸运的是:D)。

有趣的是,在Windows中我没有得到这个段错误。问题是一样的...我猜它与内存管理和编译器有关......它真的让我不知所措。

感谢大家的投入;)

干杯