我创build了一个结构来保存一些数据,然后声明一个向量来保存该结构。
但是当我做一个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*/ };
最初,该结构没有复制,构造函数或析构函数。 当我在下面阅读这篇文章时,我加了后者。
将项目推入STL容器后,Seg错误
但最终的结果是一样的。
有一件事情让我心烦! 当我第一次将一些数据推入vector时,一切都很顺利。 稍后在代码中,当我尝试将更多数据推送到vector中时,我的应用程序只是段错误!
向量被声明
vector<Group> Groups
并且是我使用它的文件的全局variables。 没有其他地方等extern …
我可以跟踪错误:
_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage- this->_M_impl._M_start);
在vector.tcc中,当我完成添加/复制到vector的最后一个元素….
据我所知。 我不应该需要任何事情做一个副本构造函数作为浅拷贝应该是足够的。 我甚至没有分配任何空间(但是我为这个string做了试用)。
我不知道是什么问题!
我使用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);
就像Neil所说的,你不需要默认的构造函数,拷贝构造函数或者析构函数:
std::string
自行清理,所以你的析构函数是不必要的。 std::string::reserve
是不必要的,因为std::string
会根据需要动态分配内存,但是它可能会带来性能上的好处。 你发布的代码看起来是正确的(它看起来非常简单直接,所以很难看到错误在哪里蔓延)。 因此,我怀疑你在代码中的其他地方破坏了内存,并且vector<Group>
就是受害者。
尝试安装Valgrind (OpenSuse应该为它提供一个包)并通过它运行你的应用程序(从命令行运行valgrind my-app
)来查看Valgrind是否可以捕获任何内存损坏。
你一定要删除析构函数。 C ++会自动调用所有数据成员的析构函数,并且对已经具有这样的析构函数的成员做事情是不必要的,并且可能是不安全的。
但是,我没有看到你的代码本身有什么问题。 你将不得不张贴一点点。 尝试扩展(…)部分 – 向我们展示涉及向量的所有代码。
像这样的内存错误可能是由删除相同的内存两次或删除您从新获得的内存。 这种错误经常发生在这样的地方。 由于DeadMG已经声明安装valgrind并寻找其他看似无关的内存问题。
好…
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();
如果旧选择的是在矢量的范围之外呢?
在这种情况下发生的事情是,旧的选择可能是-1 …虽然这没有崩溃在这一点上,它正在写点东西在别的地方…
我应该开始使用at()运算符并检查异常,或者只检查“oldselected”是否> 0和<Groups.size()[首选解决方案]。
所以对John和Josh的提醒让我想起了Valgrind。
我之前使用过它,但从来不需要做任何重要的事情(幸运的是:D)。
有趣的是,在Windows中我没有得到这个段错误。 问题是一样的…我想这与内存管理和编译器有关…它真的逃避了我。
感谢大家的意见;)
干杯