Original Post
I'm having a very nasty bug. I finally found what the problem is, but I'm unsure whether this has to do with a problem elsewhere (memory overwrite?) or my usage with a std::set. I'm also not sure how a std::set can determine whether items are equal purely based on the result of the lesser-then operator.
What happens:
- Sometimes it does not find() equal SignalID's and then it wont erase it.
- Sometimes it find()s both unequal and equal SignalID's, but then only erases the equal one.
Am I using a std::set wrong? Or does this look like memory corruption?
Thanks!
class Signal; //////////////////////////////////////////////////////////////// struct SignalID { Signal *signal; unsigned int id; SignalID(Signal *i_signal, unsigned int i_id); bool operator < (const SignalID &instance) const; }; //////////////////////////////////////////////////////////////// SignalID::SignalID(Signal *i_signal, unsigned int i_id) : signal(i_signal), id(i_id) { } inline bool SignalID::operator < (const SignalID &instance) const { return (signal < instance.signal || id < instance.id); } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// class Signal { public: ... void detach_signal(Signal *signal, unsigned int id); ... std::set<SignalID> signal_ids; }; void Signal::detach_signal(Signal *signal, unsigned int id) { for (std::set<SignalID>::iterator iterator = signal_ids.begin(); iterator != signal_ids.end(); ++iterator) { std::cerr << (*iterator).id << " " << (*iterator).signal << " compared with " << id << " " << signal << " gives " << ((*iterator) < SignalID(signal, id)) << "\n"; if (signal_ids.find(SignalID(signal, id)) != signal_ids.end()) { std::cerr << "found\n"; } } std::cerr << "erased " << signal_ids.erase(SignalID(signal, id)) << "\n"; }What happens:
- Sometimes it does not find() equal SignalID's and then it wont erase it.
- Sometimes it find()s both unequal and equal SignalID's, but then only erases the equal one.
Am I using a std::set wrong? Or does this look like memory corruption?
Thanks!