在构造函数中使用Q_ASSERT

Using Q_ASSERT in constructor

本文关键字:ASSERT 构造函数      更新时间:2023-10-16

我需要确保传递给构造函数的某个指针不是NULL。通常我只在函数的开头放一个Q_ASSERT(),像这样:

void Class::doStuff( Object *object )
{
    Q_ASSERT( object );
    // do stuff
}

但是由于构造函数是一个特殊函数,我想知道这种相同的技术是否合适。在这样的构造函数中使用Q_ASSERT有什么问题吗?

Class::Class( Object *object, QObject *parent = NULL ) 
    :
QObject( parent ),
_object( object )
{
    // make sure that object is not NULL
    Q_ASSERT( object );
    // do stuff that will dereference the pointer, hence it must not be NULL
    if( object->hasSomething() )
        // do stuff
}

如果这是不好的做法,检查NULL的正确方法是什么,理想情况下是在施工时?

在构造函数中使用Q_ASSERT是可以的。没有理由说它不是。它只是输出一条消息。

这实际上取决于如何以及在哪里使用您的代码。你是对的,构造函数是一个特殊的函数,最佳实践是

  1. 中使用最小的外部函数和调用(在您的代码库之外)不要使用可能引发异常的调用。这是因为当抛出异常时,在退出应用程序并调用适当的catch调用之前,会对堆栈进行unwind以进行清理。

如果是在构造函数中,那么特定对象的状态就不清楚了,不知道做了什么,需要清理什么等等。所以在一天结束的时候,这是你自己的决定,看看这是否是你的问题。