У меня очень странная проблема с кодом, использующим std :: sort. Если я заменю std :: sort на stable_sort, проблема исчезнет.
class Entry
{
public:
Entry() : _date(0), _time(0), _size(0) {}
Entry(unsigned int d, unsigned int t, unsigned int s) : _date(d), _time(t), _size(s) {}
~Entry() {_size=0xfffffffe;}
unsigned int _date, _time, _size;
};
void initialise(std::vector<Entry> &vec)
vec.push_back(Entry(0x3f92, 0x9326, 0x1ae));
vec.push_back(Entry(0x3f92, 0x9326, 0x8a54));
//.... + a large number of other entries
}
static bool predicate(const Entry &e1, const Entry &e2)
{
// Sort by date and time, then size
if (e1._date < e2._date )
return true;
if (e1._time < e2._time )
return true;
return e1._size < e2._size;
}
int main (int argc, char * const argv[]) {
using namespace std;
vector<Entry> vec;
initialise(vec);
sort(vec.begin(), vec.end(), predicate);
vector<Entry>::iterator iter;
for (iter=vec.begin(); iter!=vec.end(); ++iter)
cout << iter->_date << ", " << iter->_time <<
", 0x" << hex << iter->_size << endl;
return 0;
}
Идея состоит в том, что я сортирую данные сначала по дате и времени, а затем по размеру. Однако, в зависимости от данных в векторе, я получу 0xfffffffe в размере, напечатанном в конце для первого объекта, что указывает на доступ к разрушенному объекту или на ошибку сегмента во время сортировки.
(Xcode 3.2.4 - 64-битная цель Intel)
Есть идеи кто-нибудь ??
Я подозреваю, что это как-то связано с моим предикатом, но я не могу понять, что это такое .... !!
Эта страница, кажется, относится к той же проблеме:
http://schneide.wordpress.com/2010/11/01/bug-hunting-fun-with-stdsort/
но причина, которую он приводит (что предикат должен определять строгое слабое упорядочение), здесь, похоже, удовлетворяется ...