使用带有new []的QSharedPointer会在valgrind中产生“mismatched free()/ delete / delete []”

时间:2011-10-24 12:40:22

标签: c++ qt smart-pointers qsharedpointer

我有以下代码:

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 个答案:

答案 0 :(得分:11)

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

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

然后

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

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