我如何知道是否分配了内存插槽
How do I know if a memory slot is allocated?
我正在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_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
这意味着在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指针是无效的。
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 如果堆分配的对象被销毁并且指针被重新分配,Qt的信号和插槽系统会工作吗?
- 矢量函数"push_back"不断将值重写到内存中的同一插槽
- 双插槽vs单插槽内存模型
- 你如何处理内存管理和信号/插槽
- 我如何知道是否分配了内存插槽
- Qt信号:将动态分配参数的所有权传递给插槽