我在C++中包装了一些sqlite3 C代码,并void(*)(void*)对此函数中的这种类型的参数感到困惑
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
所以我的包装看起来像
int Query::Blob(int index, const void* blob, int blob_size, void* memory_management){
return sqlite3_bind_blob(stmt, index, blobl, blob_size, memory_management);
}
Run Code Online (Sandbox Code Playgroud)
我应该能够将以下内容传递给最后一个参数
一些功能可以释放blob内存
无论是SQLITE_STATIC或SQLITE_TRANSIENT定义
这两个定义不出所料地定义为
typedef void (*sqlite_3_destructor_type)(void*);
但我真的不明白void/void语法.如何在我的C++方法中包装它以接受类似函数delete或定义?
我在代码库中找到了这个(简化的)代码片段,这让我觉得不愉快.它既可以工作,也可以工作,或者永远不会被调用.我希望有一些缓冲区溢出,但是当我在一个在线编译器中尝试它时,它肯定不起作用,但也不会溢出.我正在查看strcat它的定义,它将从其null终止符开始将源写入目标,但我假设在这种情况下,目标缓冲区(创建为a std::string)应该太小..
#include <iostream>
#include "string.h"
using namespace std;
void addtostring(char* str){
char str2[12] = "goodbye";
strcat(str, str2);
}
int main()
{
std::string my_string = "hello";
addtostring((char*)my_string.c_str());
cout << my_string << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个操作的实际行为是什么?