【问题标题】:Using QSharedPointer with new[] yields "Mismatched free() / delete / delete[]" in valgrind将 QSharedPointer 与 new[] 一起使用会在 valgrind 中产生“不匹配的 free()/delete/delete[]”
【发布时间】:2011-10-24 12:40:22
【问题描述】:

我有以下代码:

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 警告?

【问题讨论】:

    标签: c++ qt smart-pointers qsharedpointer


    【解决方案1】:

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

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

    然后

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

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

    【讨论】:

    • Qt 只是缺少对应的数组,例如 boost::shared_array。 C++11 也缺少这一点。所以你有最好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多