【问题标题】:How do I know if a memory slot is allocated?我如何知道是否分配了内存插槽?
【发布时间】:2014-05-20 14:42:28
【问题描述】:

我在我的 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?

提前谢谢你, 如果您需要我的代码的任何部分,请告诉我

【问题讨论】:

标签: c++ pointers


【解决方案1】:

要么 a) 不要这样做,即永远不要存储对动态分配项目的引用,或者 b) 不要将指针传递给分配表。你最好的选择是不直接删除它,而是使用引用计数,只有在没有引用时才删除,(垃圾收集),否则你将在删除时设置为 null 并且必须在使用前检查任何地方它不为空。请注意,如果您确实需要做很多此类事情,请切换到python,它会一直自动为您执行此操作。有QT bindings for python

看看these的答案。

【讨论】:

  • 可能适用于 QT 对象,但您只需要使用库的新机制和删除机制。
【解决方案2】:

简短的回答,你不能。

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

【讨论】:

    【解决方案3】:

    如果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
    

    意思是shared_ptr释放其分配的数据后,weak_ptr也会过期(过期返回true)。

    Qt 有类似的类来帮助你。 QSharedPointer、QWeakPointer 等。如果你需要跟踪一个 QObject 指针是否被删除,你应该使用 QPointer

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

    受保护的指针 QPointer 的行为类似于普通的 C++ 指针 T *, 除了当被引用的对象被自动设置为 0 被破坏(不像普通的 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 指针已失效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2014-12-24
      • 1970-01-01
      • 2018-04-28
      • 2014-03-01
      相关资源
      最近更新 更多