2015-04-01 97 views
0

在Linux上使用Eclipse CDT。下面是代碼和編譯過程中的警告:在編譯sqlite3 C++ struct sqlite3的前向聲明導致析構函數中刪除的無效指針錯誤

g++ -I/opt/ros/indigo/include -I"/home/user/workspace/Project/include" -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++11 -MMD -MP -MF"src/DatabaseConnection.d" -MT"src/DatabaseConnection.d" -o "src/DatabaseConnection.o" "../src/DatabaseConnection.cpp" 
../src/DatabaseConnection.cpp: In destructor ‘DatabaseConnection::~DatabaseConnection()’: 
../src/DatabaseConnection.cpp:48:9: warning: possible problem detected in invocation of delete operator: [enabled by default] 
    delete _database; 
     ^
../src/DatabaseConnection.cpp:48:9: warning: invalid use of incomplete type ‘struct sqlite3’ [enabled by default] 
In file included from /home/user/workspace/Project/include/DatabaseConnection.hpp:11:0, 
       from ../src/DatabaseConnection.cpp:8: 
/usr/include/sqlite3.h:228:16: warning: forward declaration of ‘struct sqlite3’ [enabled by default] 
typedef struct sqlite3 sqlite3; 
       ^
../src/DatabaseConnection.cpp:48:9: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined 
    delete _database; 

的方法

#ifndef DATABASECONNECTION_HPP_ 
#define DATABASECONNECTION_HPP_ 

#include <sqlite3.h> 
#include <string> 

using namespace std; 

class DatabaseConnection 
{ 
private: 
    sqlite3 *_database; 
public: 
    // constructors 
    DatabaseConnection(const string &databaseURI, char mode='w'); 

    // destructor 
    ~DatabaseConnection(); 
}; 

#endif /* DATABASECONNECTION_HPP_ */ 

/* 
* DatabaseConnection.cpp 
* 
* Created on: Mar 31, 2015 
*  Author: Michael Wilson ([email protected]) 
*/ 

#include <DatabaseConnection.hpp> 
#include <Exception.hpp> 
#include <sqlite3.h> 
#include <stdlib.h> 
#include <sstream> 
#include <FormattedString.hpp> 
#include <FileUtils.hpp> 

using namespace std; 

DatabaseConnection::DatabaseConnection(const string &databaseURI, char mode) 
{ 

    if (mode != 'w' && mode != 'r') 
     throw Exception("Exception DatabaseConnection::DatabaseConnection. Mode must be \'r\' or \'w\' for read/write connection mode"); 

    int flags = (mode == 'w') ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY; 

    // this enables opening databases using URI 
    flags |= SQLITE_OPEN_URI; 

    // verify the database URI is formed correctly 
    if (!FormattedString::isFormatted(databaseURI, "file:/.*") && !FormattedString::isFormatted(databaseURI, "http:/.*")) { 
     // if not formed using standard URI syntax, then assume a file path and verify it exists 
     if (!FileUtils::Exists(databaseURI)) 
      throw Exception("Exception DatabaseConnection::DatabaseConnection. File does not exist: " + databaseURI); 
    } 


    // returns non-zero on open error 
    if (sqlite3_open_v2(databaseURI.c_str(), &_database, flags, NULL)) { 
     ostringstream ss; 
     ss << "Exception DatabaseConnection::DatabaseConnection. Error opening database " << databaseURI; 
     throw Exception(ss.str()); 
    } 
} 

DatabaseConnection::~DatabaseConnection() 
{ 
    sqlite3_close(_database); 
    delete _database; 
} 

,並警告非常相似,這是什麼人做了http://www.dreamincode.net/forums/topic/122300-sqlite-in-c/

但我想確保釋放數據庫指針'stru ct sqlite3'類成員

+0

請發佈'DatabaseConnection.cpp'。 – PaulMcKenzie 2015-04-01 02:58:42

+0

'struct sqlite3 * _database;'這裏沒有必要說'struct'。只需要這麼做'sqlite3 * _database;' – PaulMcKenzie 2015-04-01 03:01:34

+0

是的。那是我嘗試過的另一種方式。當現在沒有struct關鍵字時,我會發布警告。 – mdude380 2015-04-01 03:03:59

回答

1

這是從sqlite3的API:https://www.sqlite.org/c3ref/close.html

的sqlite3_close()和sqlite3_close_v2()例程是用於sqlite3的對象析構函數。調用sqlite3_close()和sqlite3_close_v2()會返回SQLITE_OK,如果sqlite3對象被成功銷燬並且所有關聯的資源都被釋放。

1

您的代碼正試圖發出delete _database;,其中_database的類型爲sqlite3。問題是編譯器不知道什麼是sqlite3

你向前聲明什麼sqlite3是,但發出delete調用需要編譯知道的sqlite3定義。您沒有提供此類型的完整定義。

+0

'sqlite3 * _database'是一個指針類型 – billz 2015-04-01 03:09:24

+0

我鏈接sqlite3庫。我無法用命令編譯來打開和關閉數據庫。不應該給我的SQLite結構的定義?另外,我可以遍歷代碼直到析構函數刪除語句。這是不是意味着結構是因爲我打開和關閉而定義的? – mdude380 2015-04-01 03:12:16

+0

@billz請注意,這些是警告,而不是錯誤。問題將在運行時發生。 – PaulMcKenzie 2015-04-01 03:14:40