Использование 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>);

Я не уверен, есть ли более элегантное решение (которое было бы неплохо)

Другие вопросы по тегам