在 valgrind 中使用 QSharedPointer 和 new[] 会产生"Mismatched free() / delete / delete[]"

Using QSharedPointer with new[] yields "Mismatched free() / delete / delete[]" in valgrind

本文关键字:delete free Mismatched valgrind new QSharedPointer      更新时间:2023-10-16

我有以下代码:

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,我得到一个"Mismatched free()/delete/delete[]"错误。我使用QSharedPointer有什么问题吗?还是我必须忍受这个valgrind警告?

解决这个问题的一种方法是编写一个自定义删除器并将其传递给QSharedPointer的构造函数,如下所示:

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

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

我不确定是否有一个更优雅的解决方案(这将是很好的)