我创建了一个结构来保存一些数据,然后声明了一个向量来保存该结构。
但是当我做一个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);
答案 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中我没有得到这个段错误。问题是一样的...我猜它与内存管理和编译器有关......它真的让我不知所措。
感谢大家的投入;)
干杯