如何解决此代码在哪里生成细分错误?
|解决方法
好吧,我没有阅读您的代码,所以我不知道它的用途是什么,但是,如果它是一个普通的c ++应用程序,并且没有修改系统默认内存管理的内容,那么您应该学习使用GDB。
http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html
可以帮助您消除那些令人讨厌的段错误,只需花费5分钟即可阅读和使用它,但可以节省数小时的printf调试。
(对不起,但仔细阅读那么多代码以找到对某些内存的错误引用将非常困难)
,您怎么能完全确定向量
v
包含50个元素,且没有哪个元素少于这个值?在这个while循环中
while(j<50)
{
(*Trans.items)[(Trans.length1)++]=v[j];
j=j+2;
}
您正在调用向量v[j]
,因此最多要访问50个向量members0ѭ的成员,而calls4 calls会上升到49,但是如果是v.size() != 50
,那么您将遇到分段错误。由于您将v
初始化为只有5个元素,并且仅当您增加其当前的最大大小时才调整其大小,这意味着ѭ0at中将至少有5个或更多成员,但这并不意味着至少有5个元素50名成员。使用second4 while的值的第二个while循环也是如此。
,稍微修改一下代码后,即可进行编译。我从valgrind得到这个:
bash> valgrind ./a.out
Invalid read of size 4
==1827== at 0xDE038: std::string::assign(std::string const&) (in /usr/lib/libstdc++.6.0.4.dylib)
==1827== by 0x282B: Data::getnextTransaction(Transaction&) (dummy.cpp:88)
==1827== by 0x2947: main (dummy.cpp:110)
==1827== Address 0x3ec6d8 is 4 bytes after a block of size 20 alloc\'d
==1827== at 0x1A6BB: operator new(unsigned long) (vg_replace_malloc.c:261)
第88行就在您的主读取循环内。提示您的循环可能会混乱。
这可能不是您的问题。 (因为我不得不注释掉assure
才能进行编译,而且我没有您的数据文件...。)但是您可以使用类似的方法来获取真正的罪魁祸首。
,编辑:(关于取消引用about11ѭ的部分已删除)
在这种情况下,Translen
可能是您的问题。如果它小于50,则将在getnextTransaction
中的while(j<50)
循环期间超过items
和share
数组的长度。杰森的答案就这一点进行了详细说明。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。