我在我的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?
提前谢谢你, 如果您需要我的代码的任何部分,请告诉我
答案 0 :(得分:0)
简短回答,你不能。
很长的答案,这取决于你使用的分配库的内存分配库或实现,或调试替换你使用的分配库以及它支持的调试功能。
答案 1 :(得分:0)
a)不要这样做,即。永远不存储对动态分配项的引用,或b)不传递指针将索引传递给分配表。你最好的选择是不要直接删除它,而是使用引用计数,只有在没有引用时删除(垃圾回收),否则你将在删除时设置为null,并且在使用前必须检查所有地方它不是空的。请注意,如果您确实需要做很多这样的事情,请切换到python,它会一直为您自动执行此操作。有QT bindings for python。
查看these个答案。
答案 2 :(得分:0)
如果Qt代码无法删除指针,那么您可以使用std::shared_ptr
和std::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指针无效。