代码之家  ›  专栏  ›  技术社区  ›  Emadpres

为什么在使用QSqlDatabase时使用“&”会出错(Qt 5.2)?

  •  0
  • Emadpres  · 技术社区  · 11 年前

    我总是使用以下代码连接到sqlite数据库。出于某些原因,我决定用 *QSqlDatabase 而不是 QSqlDatabase .

    我所做的只是利用 & 在我的旧代码前面( 第12行 ). 但是代码崩溃了 第6行 .

    不管怎样,有人给了我 第14行 它起作用了。

    所以……我无法理解我的第一个代码有什么问题,以及为什么建议的代码 它起作用。

    Foo::Foo(QString path_="db_path_name") {
        InitialDataBase(path_);
        bool isOpened = db->open();
        if(!isOpened)   exit(1);
        else            
            queryExecutor = new QSqlQuery(*db);  // --> Line_6
    }
    
    void Foo::InitialDataBase(QString path_) {
    
        // Line_12 => DOESN'T WORK
        db = &(QSqlDatabase::addDatabase("QSQLITE"));   
        // Line_14 => WORK
        db  = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE"));
    
        db->setHostName("localhost");
        db->setDatabaseName(path_);
        db->setUserName("admin");
        db->setPassword("admin");
    }
    
    1 回复  |  直到 11 年前
        1
  •  0
  •   Frank Osterfeld    11 年前

    在第12行中,您将获取 addDatabase() 该对象是临时的,并在语句结束后立即销毁(在第12行之后)。因此,您最终会得到一个悬空指针,即指向已删除对象的指针。 取消引用悬空指针是未定义的行为。实际上,它通常会崩溃。

    在第14行中,在堆上创建了一个新的QSqlDatabase对象,创建了从addDatabase()返回的临时QSqlDatabase对象的副本。此处调用复制构造函数QSqlDatabase(const QSqlDatabase&)。临时对象已销毁,但堆上的副本仍保留。请注意,您必须删除 db 稍后,否则将导致内存和资源泄漏(打开DB连接)。

    为什么在这里使用指针?特别是作为一个初学者,它将导致的只是崩溃和泄漏,正如本示例所示;)