wxSQLite3 中 wxStringCollection 创建的段错误
Segfault on wxStringCollection Creation in wxSQLite3
我正在编写一个使用 wxSQLite3 库的应用程序,它是 wxWidgets 跨平台 GUI 编程框架的 libsqlite3 的包装器。由于某种原因,调用 wxSQLite3Database::CreateStringCollection()
会导致段错误。 (请参阅下面的示例代码。)
我不明白的是,使用wxIntegerCollection
没有问题;该问题仅在使用 wxStringCollection
.
时出现
wxSQLite3 库编译时带有命名集合支持(根据 wxSQLite3Database::HasNamedCollectionSupport()
)。此问题发生在 Windows/VC++8 和 Linux/GCC.
//Sample code to illustrate problem
#include <wx/app.h>
#include <wx/arrstr.h>
#include <wx/wxsqlite3.h>
class Database {
public:
Database();
~Database() {db.Close();}
void query(const wxArrayString& array);
private:
wxSQLite3Database db;
wxSQLite3Statement strStmt;
wxSQLite3StringCollection strCollection;
};
Database::Database() {
db.Open(wxT(":memory:"));
db.EnableForeignKeySupport(true);
// Create and populate tables
db.ExecuteUpdate(wxT("CREATE TABLE T1(id int primary key, val text);"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (1, 'one');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (2, 'two');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (3, 'three');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (4, 'four');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (5, 'five');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (6, 'six');"));
// Create the collection and statement
strCollection = db.CreateStringCollection(wxT("valX_list")); //segfaults here
strStmt = db.PrepareStatement(wxT("select * from T1 where val in valX_list;"));
}
void Database::query(const wxArrayString& array) {
strStmt.Reset();
strCollection.Bind(array);
wxSQLite3ResultSet r_set = strStmt.ExecuteQuery();
while (r_set.NextRow()) {
wxPrintf(wxT("ID:%i Val: %s\n"),
r_set.GetInt(wxT("id")),
r_set.GetString(wxT("val")).c_str()
);
}
}
void runTest() {
Database db;
wxArrayString vals;
vals.Add(wxT("two"));
vals.Add(wxT("four"));
vals.Add(wxT("six"));
db.query(vals);
}
int main() {
wxSQLite3Database::InitializeSQLite();
runTest();
wxSQLite3Database::ShutdownSQLite();
return 0;
}
在您的问题中,您没有说明您使用的是哪个版本的 wxSQLite3。不幸的是方法 wxSQLite3StringCollection::operator= 有一个错误,这个错误在最新的 wxSQLite3 版本 3.2.0 中得到了修复。该错误很可能导致段错误。
如果你碰巧使用3.2.0之前的wxSQLite3版本,你应该升级到3.2.0版本。
我正在编写一个使用 wxSQLite3 库的应用程序,它是 wxWidgets 跨平台 GUI 编程框架的 libsqlite3 的包装器。由于某种原因,调用 wxSQLite3Database::CreateStringCollection()
会导致段错误。 (请参阅下面的示例代码。)
我不明白的是,使用wxIntegerCollection
没有问题;该问题仅在使用 wxStringCollection
.
wxSQLite3 库编译时带有命名集合支持(根据 wxSQLite3Database::HasNamedCollectionSupport()
)。此问题发生在 Windows/VC++8 和 Linux/GCC.
//Sample code to illustrate problem
#include <wx/app.h>
#include <wx/arrstr.h>
#include <wx/wxsqlite3.h>
class Database {
public:
Database();
~Database() {db.Close();}
void query(const wxArrayString& array);
private:
wxSQLite3Database db;
wxSQLite3Statement strStmt;
wxSQLite3StringCollection strCollection;
};
Database::Database() {
db.Open(wxT(":memory:"));
db.EnableForeignKeySupport(true);
// Create and populate tables
db.ExecuteUpdate(wxT("CREATE TABLE T1(id int primary key, val text);"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (1, 'one');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (2, 'two');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (3, 'three');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (4, 'four');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (5, 'five');"));
db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (6, 'six');"));
// Create the collection and statement
strCollection = db.CreateStringCollection(wxT("valX_list")); //segfaults here
strStmt = db.PrepareStatement(wxT("select * from T1 where val in valX_list;"));
}
void Database::query(const wxArrayString& array) {
strStmt.Reset();
strCollection.Bind(array);
wxSQLite3ResultSet r_set = strStmt.ExecuteQuery();
while (r_set.NextRow()) {
wxPrintf(wxT("ID:%i Val: %s\n"),
r_set.GetInt(wxT("id")),
r_set.GetString(wxT("val")).c_str()
);
}
}
void runTest() {
Database db;
wxArrayString vals;
vals.Add(wxT("two"));
vals.Add(wxT("four"));
vals.Add(wxT("six"));
db.query(vals);
}
int main() {
wxSQLite3Database::InitializeSQLite();
runTest();
wxSQLite3Database::ShutdownSQLite();
return 0;
}
在您的问题中,您没有说明您使用的是哪个版本的 wxSQLite3。不幸的是方法 wxSQLite3StringCollection::operator= 有一个错误,这个错误在最新的 wxSQLite3 版本 3.2.0 中得到了修复。该错误很可能导致段错误。
如果你碰巧使用3.2.0之前的wxSQLite3版本,你应该升级到3.2.0版本。