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

时间:2014-04-08 05:03:35

标签: c++ pointers

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

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

3 个答案:

答案 0 :(得分:0)

简短回答,你不能。

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

答案 1 :(得分:0)

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

查看these个答案。

答案 2 :(得分:0)

如果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也会过期(expired返回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指针无效。