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

arn*_*rne 4 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);
}
Run Code Online (Sandbox Code Playgroud)

在某些时候,QSharedPointer此函数返回的内容将超出范围,构造函数中设置的指针将被释放.使用valgrind 3.6.1,我得到一个"不匹配的free()/ delete/delete []"错误.我的使用是否有任何问题,QSharedPointer或者我是否必须忍受这种valgrind警告?

arn*_*rne 11

解决此问题的一种方法是编写自定义删除器并将其传递给QSharedPointer类似的构造函数:

template <typename T_>
void do_delete(T_ buf[])
{
    delete[] buf;
}
Run Code Online (Sandbox Code Playgroud)

然后

QSharedPointer<unsigned int> buffer(new unsigned int[siz], do_delete<unsigned int>);
Run Code Online (Sandbox Code Playgroud)

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

  • Qt只是缺少数组对应物,比如boost :: shared_array.所以C++ 11也没那么缺失.所以你有最好的解决方案. (3认同)