从SQLite数据库

时间:2016-02-11 16:49:47

标签: c++ sqlite dll virtual-destructor

我正在尝试编写一个与不同数据库提供程序通信的C ++程序。现在一切正常,但是在退出时我试图关闭连接并且断开连接命令崩溃。目前我正在使用SQLite进行测试,所以它可能属于这个特定的。

程序终止时是否必须关闭与SQLite的连接?我认为通常发布程序正在使用的资源是一个好主意,但是这个案例呢?我的意思是在这种情况下,当程序退出时,SQLite DB文件将被释放回系统,因此它实际上不会丢失。

谢谢。

[编辑]

根据要求,我提交了我使用的代码。

在DLL1(database.h)中:

#ifndef DBMANAGER_DATABASE
#define DBMANAGER_DATABASE

class __declspec(dllexport) Database
{
public:
    Database();
    virtual ~Database();
    static void *operator new(size_t size);
    static void operator delete(void *ptr, size_t size);
};
#endif

在DLL1(database.cpp)

#include <string>
#include "database.h"

Database::Database()
{
}

Database::~Database()
{
}

void *Database::operator new(std::size_t size)
{
    return ::operator new( size );
}

void Database::operator delete(void *ptr, std::size_t size)
{
    return ::operator delete( ptr );
}

在DLL2中:(database_sqlite.h):

#ifndef DBMANAGER_SQLITE
#define DBMANAGER_SQLITE
class __declspec(dllexport) SQLiteDatabase : public Database
{
public:
    SQLiteDatabase();
    virtual ~SQLiteDatabase();
    virtual int Connect(const char *selectedDSN, std::vector<std::wstring> &errorMsg);
protected:
    void GetErrorMessage(int code, std::wstring &errorMsg);
private:
    sqlite3 *m_db;
};
#endif

在DLL2中:(database_sqlite.cpp)

#ifdef WIN32
#include <windows.h>
#pragma execution_character_set("utf-8")
#endif
#include <vector>
#include <string>
#include <sqlext.h>
#include "sqlite3.h"
#include "database.h"
#include "database_sqlite.h"

SQLiteDatabase::SQLiteDatabase() : Database()
{
}

SQLiteDatabase::~SQLiteDatabase()
{
    sqlite3_close( m_db );
}

int SQLiteDatabase::Connect(const char *selectedDSN, std::vector<std::wstring> &errorMsg)
{
    int result = 0;
    std::wstring errorMessage;
    int res = sqlite3_open( selectedDSN, &m_db );
    if( res != SQLITE_OK )
    {
        // get error messages GetErrorMessage( res, errorMessage );
        errorMsg.push_back( errorMessage );
        result = 1;
    }
    else
    {
        res = sqlite3_exec( m_db, "PRAGMA foreign_keys = ON", NULL, NULL, NULL );
        if( res != SQLITE_OK )
        {
            // get error message GetErrorMessage( res, errorMessage );
            errorMsg.push_back( errorMessage );
            result = 1;
        }
    }
    return result;
}

在DLL3中:(dialogs.cpp)

#ifdef __GNUC__
#pragma implementation "dialogs.h"
#endif

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#include <vector>
#include "sqlite3ext.h"
#include "database.h"
#include "database_sqlite.h"

#ifdef _WINDOWS

BOOL APIENTRY DllMain( HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    lpReserved = lpReserved;
    hModule = hModule;
    int argc = 0;
    char **argv = NULL;
    switch( fdwReason )
    {
    case DLL_PROCESS_ATTACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
#endif

extern "C" __declspec(dllexport) Database *DatabaseProfile(Database *db)
{
    db = new SQLiteDatabase;
    return db;
}

在主应用程序(test_app.cpp)中:

#include "stdafx.h"
#include "database.h"
#include <windows.h>
#include <stdio.h>

typedef Database *(__cdecl *MYFUNC)(Database *);

class A
{
public:
    A(Database *db)
    {
    m_db = NULL;
    HINSTANCE hInst = LoadLibrary( TEXT( "dialogs.dll" ) );
    MYFUNC func = (MYFUNC) GetProcAddress( hInst, "DatabaseProfile" );
    m_db = func( db );
    }
    ~A()
    {
    }
    Database *GetDatabase()
    {
        return m_db;
    }
private:
    Database *m_db;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Database *db = NULL, *m_db;
    A *a = new A( db );
    m_db = a->GetDatabase();
    delete m_db;
    delete a;
    return 0;
}

[编辑]

运行此代码我正在执行崩溃&#34;删除&#34; m_db&#34;线。 SQLite是从源代码编译而来的。

有什么想法吗?

谢谢。

0 个答案:

没有答案