在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'類成員
請發佈'DatabaseConnection.cpp'。 – PaulMcKenzie 2015-04-01 02:58:42
'struct sqlite3 * _database;'這裏沒有必要說'struct'。只需要這麼做'sqlite3 * _database;' – PaulMcKenzie 2015-04-01 03:01:34
是的。那是我嘗試過的另一種方式。當現在沒有struct關鍵字時,我會發布警告。 – mdude380 2015-04-01 03:03:59