Использование QSharedPointer с new [] приводит к «Несоответствие free () / delete / delete []» в valgrind - PullRequest
4 голосов
/ 24 октября 2011

У меня есть следующий код:

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?

1 Ответ

11 голосов
/ 24 октября 2011

Один из способов исправить это - написать пользовательский удалитель и передать его конструктору QSharedPointer, например, так:

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

А потом

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

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

...