Использование QSharedPointer с new[] приводит к "Несоответствие free() / delete / delete[]" в valgrind
У меня есть следующий код:
QPair<QSharedPointer<unsigned int>, int> someclass::somefunction() {
int siz = data_size();
QSharedPointer<unsigned int> buffer(new unsigned int[siz]);
// Fill the buffer...
return qMakePair(buffer, siz);
}
В какой-то момент QSharedPointer
возвращенный этой функцией выйдет из области видимости и указатель в конструкторе будет свободен. Используя valgrind 3.6.1, я получаю сообщение об ошибке "Несоответствие free() / delete / delete[]". Что-то не так с моим использованием QSharedPointer
или мне просто нужно жить с этим вальгриндом?
1 ответ
Решение
Один из способов исправить это - написать пользовательское средство удаления и передать его конструктору QSharedPointer
вот так:
template <typename T_>
void do_delete(T_ buf[])
{
delete[] buf;
}
А потом
QSharedPointer<unsigned int> buffer(new unsigned int[siz], do_delete<unsigned int>);
Я не уверен, есть ли более элегантное решение (которое было бы неплохо)