Использование 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 или мне просто нужно жить с этим предупреждением valgrind?


person arne    schedule 24.10.2011    source источник


Ответы (1)


Один из способов исправить это — написать собственный модуль удаления и передать его конструктору QSharedPointer следующим образом:

template <typename T_>
void do_delete(T_ buf[])
{
    delete[] buf;
}

А потом

QSharedPointer<unsigned int> buffer(new unsigned int[siz], do_delete<unsigned int>);

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

person arne    schedule 24.10.2011
comment
В Qt просто отсутствует аналог массива, например boost::shared_array. Так что С++ 11 отсутствует. Так что у вас есть лучшее решение. - person edA-qa mort-ora-y; 24.10.2011