如何在qt中删除之前检查指针是否存在
How to check for existence of a pointer before delete in qt
我正在使用 QAbstractTableModel
。该模型在其中保存数据。它是在用户点击时创建和删除的。
这是用户点击创建模型后连接的插槽:
void clicked(){
model = new QAbstractTableModel(data);
model->setManyThings();
}
这是用户点击清除模型后连接的插槽:
void clear(){
if (model != nullptr)
delete model;
}
但是,这不能检查model
是否存在。如果我点击两次清除程序直接崩溃。如果我点击clear没有创建模型,程序直接崩溃
那么如何检查模型是否存在
您在第一次调用时删除了 model
对象,显然在第二次调用中它崩溃了,因为您试图调用一个已经删除的对象。
事实上,你实际上是在检查model
是否存在,如果model != nullptr
意味着这个指针指向一个实际的对象。
如果要重置 'model' 对象,只需在删除另一个对象后创建一个新对象:
void clear(){
if (model != nullptr)
{
delete model;
model = new QAbstractTableModel(data);
}
}
如果您只想删除它并继续进行适当的检查,只需将指针设置为 nullptr
:
void clear(){
if (model != nullptr)
{
delete model;
model = nullptr;
}
}
只需要在构造函数中和删除后clear
中设置指针为null即可
更好的是,使用智能指针。
要处理这种情况,您必须关心 model
指针的值。以下是几个步骤:
a) 在您的 class 构造函数中初始化了 model
指针,
b) 将model
指针值删除后设置为null,即:
void clear() {
if (model != 0) {
delete model;
model = 0;
}
}
您无法测试任意指针是否有效,但您的 clear
应该 "null" model
表明它已被删除:
void clear(){
delete model;
model = nullptr;
}
请注意,delete
空指针是有效的。
我建议开始使用智能指针。有很多选项可以检查指针是否存在。
- 由于您使用的是 Qt,请查看 QPointer for
QObject
based classes。
- 如果对象被删除,该指针将自身重置为 0,因此您不需要实现宏或您自己的 class。
- 如果您使用的是 c++11,请使用 [std::shared_ptr]。 (http://en.cppreference.com/w/cpp/memory/shared_ptr) 因为如果对象被删除,它也会将自己设置为
nullptr
。
C++11 standard as well as a lot in Qt中还有很多其他的智能指针(这个比较老了link,但是资料还是有效的)
我正在使用 QAbstractTableModel
。该模型在其中保存数据。它是在用户点击时创建和删除的。
这是用户点击创建模型后连接的插槽:
void clicked(){
model = new QAbstractTableModel(data);
model->setManyThings();
}
这是用户点击清除模型后连接的插槽:
void clear(){
if (model != nullptr)
delete model;
}
但是,这不能检查model
是否存在。如果我点击两次清除程序直接崩溃。如果我点击clear没有创建模型,程序直接崩溃
那么如何检查模型是否存在
您在第一次调用时删除了 model
对象,显然在第二次调用中它崩溃了,因为您试图调用一个已经删除的对象。
事实上,你实际上是在检查model
是否存在,如果model != nullptr
意味着这个指针指向一个实际的对象。
如果要重置 'model' 对象,只需在删除另一个对象后创建一个新对象:
void clear(){
if (model != nullptr)
{
delete model;
model = new QAbstractTableModel(data);
}
}
如果您只想删除它并继续进行适当的检查,只需将指针设置为 nullptr
:
void clear(){
if (model != nullptr)
{
delete model;
model = nullptr;
}
}
只需要在构造函数中和删除后clear
中设置指针为null即可
更好的是,使用智能指针。
要处理这种情况,您必须关心 model
指针的值。以下是几个步骤:
a) 在您的 class 构造函数中初始化了 model
指针,
b) 将model
指针值删除后设置为null,即:
void clear() {
if (model != 0) {
delete model;
model = 0;
}
}
您无法测试任意指针是否有效,但您的 clear
应该 "null" model
表明它已被删除:
void clear(){
delete model;
model = nullptr;
}
请注意,delete
空指针是有效的。
我建议开始使用智能指针。有很多选项可以检查指针是否存在。
- 由于您使用的是 Qt,请查看 QPointer for
QObject
based classes。- 如果对象被删除,该指针将自身重置为 0,因此您不需要实现宏或您自己的 class。
- 如果您使用的是 c++11,请使用 [std::shared_ptr]。 (http://en.cppreference.com/w/cpp/memory/shared_ptr) 因为如果对象被删除,它也会将自己设置为
nullptr
。
C++11 standard as well as a lot in Qt中还有很多其他的智能指针(这个比较老了link,但是资料还是有效的)