У меня есть какой-то старый код, который использует qsort
для сортировки MFC CArray
структур, но иногда я вижу, что может быть в нескольких потоках, вызывающих qsort
одновременно. Код, который я использую, выглядит примерно так:
struct Foo
{
CString str;
time_t t;
Foo(LPCTSTR lpsz, time_t ti) : str(lpsz), t(ti)
{
}
};
class Sorter()
{
public:
static void DoSort();
static int __cdecl SortProc(const void* elem1, const void* elem2);
};
...
void Sorter::DoSort()
{
CArray<Foo*, Foo*> data;
for (int i = 0; i < 100; i++)
{
Foo* foo = new Foo("some string", 12345678);
data.Add(foo);
}
qsort(data.GetData(), data.GetCount(), sizeof(Foo*), SortProc);
...
}
int __cdecl SortProc(const void* elem1, const void* elem2)
{
Foo* foo1 = (Foo*)elem1;
Foo* foo2 = (Foo*)elem2;
// 0xC0000005: Access violation reading location blah here
return (int)(foo1->t - foo2->t);
}
...
Sorter::DoSort();
Я собираюсь реорганизовать этот ужасный код, чтобы использовать вместо него std::sort
, но мне стало интересно, действительно ли вышесказанное небезопасно?
EDIT: Sorter::DoSort
на самом деле является статической функцией, но сама не использует статические переменные.
EDIT2: функция SortProc была изменена для соответствия реальному коду.