Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SQLite注册VFS会导致分段错误_C++_Sqlite - Fatal编程技术网

C++ SQLite注册VFS会导致分段错误

C++ SQLite注册VFS会导致分段错误,c++,sqlite,C++,Sqlite,我正在尝试在SQLite中注册一个: #include <iostream> #include "sqlite3.h" int vfs_open(sqlite3_vfs* vfs, const char *zName, sqlite3_file* file, int flags, int *pOutFlags) { std::cout << "Hello open"; return SQLITE_OK; } int vfs_access(sqlite3_vfs

我正在尝试在SQLite中注册一个:

#include <iostream>
#include "sqlite3.h"

int vfs_open(sqlite3_vfs* vfs, const char *zName, sqlite3_file* file, int flags, int *pOutFlags)
{

  std::cout << "Hello open";
  return SQLITE_OK;
}
int vfs_access(sqlite3_vfs* vfs, const char *zName, int flags, int *pResOut)
{
  std::cout << "Hello access";
  return 0;
}

int main () {
  static sqlite3_vfs vfs;
  vfs.iVersion = 1;
  vfs.szOsFile = 1000;
  vfs.zName = "foo";
  vfs.xOpen = vfs_open;
  vfs.xAccess = vfs_access;

  sqlite3_vfs_register(&vfs, 0);

  sqlite3 *db;
  sqlite3_open_v2("db.db", &db, SQLITE_OPEN_READONLY, "foo");
}

我做错了什么,有什么帮助吗?

sqlite3\u vfs结构有很多函数的指针。我找不到关于您必须定义的最小函数集的任何文档,因此假设它们都是必需的,甚至是存根函数,可能更安全一些


在您的例子中,我猜sqlite正在调用一个您尚未定义的函数(可能是
xFullPathname
),导致尝试以NULL值运行函数。

sqlite 3\u vfs结构具有许多函数的指针。我找不到关于您必须定义的最小函数集的任何文档,因此假设它们都是必需的,甚至是存根函数,可能更安全一些


在您的情况下,我猜sqlite正在调用一个您尚未定义的函数(可能是
xFullPathname
),导致尝试以NULL值运行函数。

有几点建议-可能在崩溃之前没有刷新跟踪写入,请使用
std:endl
刷新它们。还有很多方法没有在您的结构中定义,可能sqlite正在调用其中一种方法(
xFullPathname
springs),您可能需要为其余方法添加虚拟函数。我找不到关于您必须定义的最小函数集的任何文档。@TheDark:这是一个很好的例子。提供一个虚拟的
xFullPathname
实现会使程序不再崩溃,但同时我仍然看不到来自
vfs\u open
的打印。OP可能应该检查
sqlite3\u open\u v2的返回值。顺便说一句:您可能希望在带有调试符号的一侧编译您自己的SQLite,以便找出它在您没有的VFS函数上崩溃的地方-这就是我所做的。@TheDark-thanking,这确实起到了作用。请回答,我可以给你+1。一些建议-可能你的跟踪写入在崩溃之前没有被刷新,请使用
std:endl
刷新它们。还有很多方法没有在您的结构中定义,可能sqlite正在调用其中一种方法(
xFullPathname
springs),您可能需要为其余方法添加虚拟函数。我找不到关于您必须定义的最小函数集的任何文档。@TheDark:这是一个很好的例子。提供一个虚拟的
xFullPathname
实现会使程序不再崩溃,但同时我仍然看不到来自
vfs\u open
的打印。OP可能应该检查
sqlite3\u open\u v2的返回值。顺便说一句:您可能希望在带有调试符号的一侧编译您自己的SQLite,以便找出它在您没有的VFS函数上崩溃的地方-这就是我所做的。@TheDark-thanking,这确实起到了作用。请回答,我可以给你+1。
$ g++ test.cc libsqlite3.dylib 
$ ./a.out
Segmentation fault: 11