我如何知道是否分配了内存插槽

How do I know if a memory slot is allocated?

本文关键字:内存插槽 分配 是否 何知道      更新时间:2023-10-16

我正在Qt项目中的一个类中动态分配一个结构。然后,我将指向该结构的指针传递给另一个类中的另一个变量。然后在某些情况下,我删除第一个分配,这样我就不再有结构了!现在的问题是:

I want my second pointer to find out if the slot it is pointing to is allocated or not, how can I do that?

提前感谢您,如果您需要我的代码

的任何部分,请告诉我

要么a)不要这样做,即永远不要存储对动态分配项的引用,要么b)不要将指针传递到分配表中。最好不要直接删除它,而是使用引用计数,并且只有在没有引用时才删除,(垃圾收集),否则您将在删除时设置为null,并且在使用之前必须到处检查它是否为null。注意,如果你真的需要经常做这类事情,那么切换到python,它会一直自动为你做这件事。python有QT绑定。

看看这些答案。

简短的回答,你不能。

答案很长,这取决于您正在使用的内存分配库或分配库的实现,或对分配库的调试替换,以及它支持什么样的调试功能。

如果Qt代码无法删除指针,则可以使用std::shared_ptrstd::weak_ptr来帮助跟踪这些内容。

#include <iostream>
#include <memory>
struct Foo { int a; };
int main()
{
        std::shared_ptr<Foo> shared = std::make_shared<Foo>();
        std::weak_ptr<Foo> weak = shared;
        std::cout << "is valid?: " << (bool)shared << weak.expired() << std::endl;
        shared.reset(); // delete the pointer   
        std::cout << "is valid?: " << (bool)shared << weak.expired() << std::endl;
        return 0;
}

结果,

is valid?: 10
is valid?: 01

这意味着在sharedptr释放其分配的数据后,weak_ptr也将过期(expired返回true)。

Qt有类似的课程可以帮助你。QSharedPointer、QWeakPointer等。如果您需要跟踪QObject指针是否被删除,则应使用QPointer

http://qt-project.org/doc/qt-5/QPointer.html

保护指针QPointer的行为类似于普通C++指针T*,除了当引用的对象为destroyed(与普通C++指针不同,后者变为"悬空"指针)。T必须是QObject的子类。

例如

#include <QCoreApplication>
#include <QDebug>
#include <QPointer>
int main(int a, char *b[])
{
    QCoreApplication app(a,b);
    QObject *obj1 = new QObject;
    QObject *obj2 = new QObject(obj1);
    QPointer<QObject> o(obj2);
    qDebug() << o.isNull();
    delete obj1;
    qDebug() << o.isNull();
    return 0;
}

结果,

false
true

正如您所看到的,子QObject指针是无效的。