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或析构函数.当我在下面阅读这篇文章时,我添加了它们.
但最终结果是一样的.
这有一个困扰我的地狱!当我第一次将一些数据推入向量时,一切都很顺利.稍后在代码中,当我尝试将更多数据推入向量时,我的应用程序只是段错误!
向量被声明
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)
像Neil说的那样,你不需要默认的构造函数,复制构造函数或析构函数:
std::string 自己清理后,所以你的析构函数永远不必要.std::string::reserve是不必要的,因为std::string它会根据需要动态分配内存,但它可以提供性能优势.您发布的代码看起来是正确的(它看起来非常简单和直接,因此很难看出错误可能在哪里蔓延).因此,我怀疑你在代码中的其他地方破坏了内存,而这vector<Group>只是受害者.
尝试安装Valgrind(OpenSuse应该为它提供一个包)并通过它运行你的应用程序(从命令行运行valgrind my-app),看看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)
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 中我没有遇到这种段错误。问题是一样的......我猜它与内存管理和编译器有关......它真的让我困惑。
感谢大家的意见;)
干杯