在vector <struct>上的segfault

And*_*ira 7 c++ linux struct vector

我创建了一个结构来保存一些数据,然后声明一个向量来保存该结构.

但是当我做一个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*/
 };
Run Code Online (Sandbox Code Playgroud)

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

将物品推入STL容器后的段故障

但最终结果是一样的.

这有一个困扰我的地狱!当我第一次将一些数据推入向量时,一切都很顺利.稍后在代码中,当我尝试将更多数据推入向量时,我的应用程序只是段错误!

向量被声明

vector<Group> Groups
Run Code Online (Sandbox Code Playgroud)

并且是我正在使用它的文件的全局变量.其他任何地方都没有外出等等......

我可以将错误追踪到:

_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage- this->_M_impl._M_start);
Run Code Online (Sandbox Code Playgroud)

在vector.tcc中,当我完成添加/复制最后一个元素到向量....

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

我不知道问题是什么!

我在使用gcc 4.1.2的OpenSuse 10.2上运行此代码

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

这段代码在我的Windows机器上"完美"运行.我用gcc 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);
Run Code Online (Sandbox Code Playgroud)

Jos*_*ley 6

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

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

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

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


And*_*ira 0

出色地...

瓦尔格林德来救援!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)
Run Code Online (Sandbox Code Playgroud)

此时在文件中我正在这样做

Groups[oldselected].subpage=SL.selected_code();
Run Code Online (Sandbox Code Playgroud)

如果 oldselected 超出了向量的范围怎么办?

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

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

感谢 John 和 Josh 让我想起了 valgrind。

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

有趣的是,在 Windows 中我没有遇到这种段错误。问题是一样的......我猜它与内存管理和编译器有关......它真的让我困惑。

感谢大家的意见;)

干杯