سؤال

لقد قمت بسحب شعري لمعرفة هذا الخطأ وقررت أن أطلب بعض المساعدة.
انا املك boost::multi_index الحاوية التي تحتوي على (string, string, double) ويضرب segfault في مرحلة ما.

إليك نسخة مبسطة من الكود الخاص بي:

#include<iostream>
....

// mySet is a multi_index container which contains <(string str1), (string str2), (double val)>

typedef mySet::index<str1>::type set_by_str1;

...

for(unsigned int i=0; i < token.size(); ++i)
{
    set_by_str1::iteration it = myContainer.get<str1>().find(token[i]);
    while(it->str1() == token[i])
    {
        cout << it->str1() << ", " << it->str2() << ", " << it->val << endl;
    }
    *it++;
}

يبدو أن هذا الرمز يعمل بشكل جيد، ولكنه يتعطل فقط عندما يصل إلى رمز مميز معين. (على العكس من ذلك، فهو لا يتعطل أبدًا عندما لا يلبي هذا الرمز المميز).
أعتقد أن هذا يحدث بسبب it يتجاوز نطاق الحاوية نفسها ولكن لا أفهم كيف يمكن أن يحدث ذلك.

تظهر رسالة خطأ GDB:

Program received signal SIGSEGV, Segmentation fault.
0x08052e83 in std::string::size (this=0x806e190) at /usr/include/c++/4.4/bits/basic_string.h:629
629       { return _M_rep()->_M_length; }

(gdb) bactrace full
#0  0x08052e83 in std::string::size (this=0x806e190) at /usr/include/c++/4.4/bits/basic_string.h:629
No locals.
#1  0x08050475 in std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=..., __str=...)
    at /usr/include/c++/4.4/bits/basic_string.h:2503
No locals.
#2  0x0804e4e0 in MyClass:MyFunction (this=0xbffff534) at src/MyCode.cpp:353 (This is where while condition exists)
... dump of HUGE trace for multi_index ...

ومن الواضح أنه يتعطل عندما أتصل it->str1() في حين الحالة، وليس بسبب ناقل الرمز المميز.كيف يمكنني منع ذلك؟حاولت أن أضيف if(it == myContainer.get<str1>().end()) break; أدناه مباشرة *it++, ، ولكن لم يساعد.
هل يمكن لأحد أن يعطيني بعض الأدلة؟
شكرًا لك!

هل كانت مفيدة؟

المحلول

هناك عدد من المشاكل في الكود الخاص بك:

  • سوف يتعطل إذا لم يكن هناك عنصر مكافئ في الحاوية token[i], ، منذ ذلك الحين find عائدات end(), ، وهو غير قابل للرجوع إليه.
  • أثناء ال while حلقة it يمكن أن تصل إلى نهاية الحاوية، ومرة ​​أخرى لن تتمكن من احترامها.
  • find لن تحصل على العنصر الأول الذي يعادل المفتاح token[i], ، وهو ما تريده على الأرجح؛يستخدم lower_bound بدلاً من.

أقترح عليك تغيير الكود كالتالي:

pair<set_by_str1::iterator, set_by_str1::iterator> p =
    myContainer.get<str1>().equal_range(token[i]);

while(p.first!=p.second)
{
    cout << p.first->str1() << ", " << p.first->str2() << ", "
         << p.first->val << endl;
    ++(p.first);
}

نصائح أخرى

أيضاً it->str1() فارغة أو token[i] باطل.

تأكد من أنها ليست فارغة وسيختفي خطأ التجزئة.

قد ترغب في استبدال while مع ال if, ، انتبه أيضًا إلى أنه إذا تم العثور على خوارزميات، فسيتم العثور عليها من هنا, ، إذا لم يتم العثور على العنصر، فإنه يُرجع المكرر باعتباره مكررًا للعنصر الأخير، والذي قد يكون كذلك str1 باعتبارها فارغة.

هل أنت متأكد أيضًا من أنك تريد التكرار على حرف سلسلة الرمز المميز بحرف وطباعة كل تطابق لكل حرف رمزي بدلاً من مجرد طباعة تطابق واحد لسلسلة الرمز المميز بأكملها؟ (على الأقل أعتقد أنها سلسلة، حيث أن نموذج التعليمات البرمجية الخاص بك لا لا تحدده).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top