我使用带有sql::SQLString
的mysqlcpp库在我的CPP应用程序中出现了一个奇怪的行为。当我从const char
或std::string
创建一个新的SQLString时,似乎构造函数会对内容造成错误。
这是我的代码:
sql::SQLString hostname("jp-sys3");
//sql::SQLString hostname = sql::SQLString(settings->database().hostname());
sql::SQLString username = sql::SQLString(settings->database().username());
sql::SQLString password = sql::SQLString(settings->database().password());
当我用这个文字或我的设置类(std :: string)初始化SQLString的变量时,我看到,在设置断点(在行sql::SQLString username
处)时,主机名的内容是完全不同的东西
例如。
realStr="\b=8";
但这与运行不同。
起初我使用了预构建库(1.1.3,x32),后来我从源代码构建它(Visual Studio 2012 Update 2)。这导致了相同的行为。 Debug构建以正确的方式处理char文字,而不是版本构建。
任何人都可以提示这里出了什么问题吗?
调试链接选项:
/OUT:"D:\Projects\STGPanel\Debug\STGPanel.exe" /MANIFEST /NXCOMPAT /PDB:"D:\Projects\STGPanel\Debug\STGPanel.pdb" /DYNAMICBASE "SDL.lib" "SDLmain.lib" "SDL_ttf.lib" "mysqlcppconn.lib" "xerces-c_3.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /INCREMENTAL:NO /PGD:"D:\Projects\STGPanel\Debug\STGPanel.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\STGPanel.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
发布链接选项:
/OUT:"D:\Projects\STGPanel\Release\STGPanel.exe" /MANIFEST /LTCG /NXCOMPAT /PDB:"D:\Projects\STGPanel\Release\STGPanel.pdb" /DYNAMICBASE "SDL.lib" "SDLmain.lib" "SDL_ttf.lib" "mysqlcppconn.lib" "xerces-c_3.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /OPT:REF /SAFESEH /PGD:"D:\Projects\STGPanel\Release\STGPanel.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\STGPanel.exe.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
答案 0 :(得分:1)
我终于找到了解决方案,这种行为是通过从mysql下载的二进制文件引起的。使用我的Visual Studio版本重建后,一切都按预期工作。
答案 1 :(得分:1)
有一个类似的问题,它可能有一天会帮助你:
似乎 mysqlcppconn (更具体地说, sql :: SQLString )并不喜欢 std :: string (继续崩溃)带有bad_alloc错误)。因此,请确保传递 char * 而不是 std :: string 。
不能工作(会编译,但崩溃):
stmt->execute("INSERT INTO logs(time) VALUES (" + to_string(timestamp) + ")");
做好工作:
string sqlRequest = "INSERT INTO logs(time) VALUES (" + to_string(timestamp) + ")";
stmt->execute(sqlRequest.c_str());