2015-04-01 99 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