将 QSharedPointer 与 new[] 一起使用会产生“不匹配的 free()/delete/delete[]”在瓦尔格林德

发布于 2024-12-11 14:12:57 字数 445 浏览 0 评论 0原文

我有以下代码:

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

I have the following code:

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);
}

At some point, the QSharedPointer returned by this function will go out of scope and the pointer set in the constructor will be free'd. Using valgrind 3.6.1, I get a "Mismatched free() / delete / delete[]" error. Is there anything wrong with my use of QSharedPointer or do I just have to live with this valgrind warning?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七色彩虹 2024-12-18 14:12:57

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

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

然后

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

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

One way to fix this is to write a custom deleter and pass that to the constructor of QSharedPointer like so:

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

And then

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

I am not sure whether there is a more elegant solution (which would be nice)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文