C++ 这是MSVC 2010中的错误还是我做错了什么?
考虑以下代码段: 在数据库_sqlite.h中:C++ 这是MSVC 2010中的错误还是我做错了什么?,c++,visual-studio-2010,c++11,C++,Visual Studio 2010,C++11,考虑以下代码段: 在数据库_sqlite.h中: class __declspec(dllexport) SQLiteDatabase : public Database { virtual void GetTableProperties(DatabaseTable *table, std::vector<std::wstring> &errorMsg); protected: struct SQLiteImpl; }; struct SQLiteDatab
class __declspec(dllexport) SQLiteDatabase : public Database
{
virtual void GetTableProperties(DatabaseTable *table, std::vector<std::wstring> &errorMsg);
protected:
struct SQLiteImpl;
};
struct SQLiteDatabase::SQLiteImpl
{
std::wstring m_catalog;
std::wstring_convert<std::codecvt_utf8<wchar_t> > m_myconv;
};
class\uu declspec(dllexport)SQLiteDatabase:公共数据库
{
虚拟void GetTableProperties(DatabaseTable*table,std::vector和errorMsg);
受保护的:
结构SQLiteImpl;
};
结构SQLiteDatabase::SQLiteImpl
{
std::wstring m_目录;
std::wstring_convert m_myconv;
};
在数据库_sqlite.cpp中:
void SQLiteDatabase::GetTableProperties(DatabaseTable *table, std::vector<std::wstring> &errorMsg)
{
sqlite3_stmt *stmt = NULL;
std::wstring errorMessage;
int result;
std::wstring query = L"SELECT * FROM \"sys.abcattbl\" WHERE \"abt_tnam\" = ? AND \"abt_ownr\" = ?;";
const unsigned char *dataFontName, *headingFontName, *labelFontName;
int res = sqlite3_prepare_v2( m_db, sqlite_pimpl->m_myconv.to_bytes( query.c_str() ).c_str(), (int) query.length(), &stmt, 0 );
if( res == SQLITE_OK )
{
const char *name = sqlite_pimpl->m_myconv.to_bytes( table->GetTableName().c_str() ).c_str(); // I used this line for debugging purposes
res = sqlite3_bind_text( stmt, 1, sqlite_pimpl->m_myconv.to_bytes( table->GetTableName().c_str() ).c_str(), -1, SQLITE_STATIC );
if( res == SQLITE_OK )
{
res = sqlite3_bind_text( stmt, 2, sqlite_pimpl->m_myconv.to_bytes( table->GetSchemaName().c_str() ).c_str(), -1, SQLITE_STATIC );
if( res == SQLITE_OK )
{
while( true )
{
void SQLiteDatabase::GetTableProperties(DatabaseTable*table,std::vector&errorMsg)
{
sqlite3_stmt*stmt=NULL;
std::wstring错误消息;
int结果;
std::wstring query=L“选择*自\”sys.abcattbl \“其中\”abt_tnam \“=”和\”abt_owner \“=?;”;
常量无符号字符*dataFontName、*headingFontName、*labelFontName;
int res=sqlite3_prepare_v2(m_db,sqlite_pimpl->m_myconv.to_字节(query.c_str()).c_str(),(int)query.length(),&stmt,0);
如果(res==SQLITE\u OK)
{
const char*name=sqlite_pimpl->m_myconv.to_bytes(table->GetTableName().c_str()).c_str();//我使用此行进行调试
res=sqlite3\u bind\u text(stmt,1,sqlite\u pimpl->m\u myconv.to\u字节(table->GetTableName().c\u str()).c\u str(),-1,sqlite\u STATIC);
如果(res==SQLITE\u OK)
{
res=sqlite3\u bind\u text(stmt,2,sqlite\u pimpl->m\u myconv.to\u字节(table->GetSchemaName().c\u str()).c\u str(),-1,sqlite\u STATIC);
如果(res==SQLITE\u OK)
{
while(true)
{
char*result\u query=sqlite3\u expanded\u sql(stmt);
res=sqlite3_步(stmt)
这里*结果查询包含=“从”sys.abcattbl”中选择*,其中“abt\u tnam”=''和“abt\u owner”=''
我正在使用MSVC2010,出乎意料的是,“*name”包含空字符串。第一次调用“to_bytes()”成功,因为我可以检查将要使用的查询
在第一次调用“to_bytes()”之后,我必须做些什么吗?或者我必须升级编译器吗?不,你做错了什么 我现在不知道
to_bytes
返回什么,但我假设它是基于std::basic_string
的类型,所以std::string
和family
to_bytes
向该字符串实例返回一个临时对象,因此当调用c_str()时
,您将获得一个指向在语句结束后将不再存在的字符串的第一个字符的指针。由于name
是一个悬空的指针,您试图输出它,因此您基本上具有未定义的行为
您必须分配内存并将字符串复制到其中,或者只使用std::string
,这样就不会出现任何类型的问题
调用sqlite3\u prepare\u v2
成功的原因是返回到\u bytes
的字符串仍然存在。当语句结束时,该字符串将被销毁,因此当res
被分配sqlite3\u prepare\u v2
的返回值时,不会在之前,因此调用成功,作为指向stri的有效指针ng通过了
尽管如此,请升级您的编译器。不,您做错了什么 我现在不知道
to_bytes
返回什么,但我假设它是基于std::basic_string
的类型,所以std::string
和family
to_bytes
向该字符串实例返回一个临时对象,因此当调用c_str()时
,您将获得一个指向在语句结束后将不再存在的字符串的第一个字符的指针。由于name
是一个悬空的指针,您试图输出它,因此您基本上具有未定义的行为
您必须分配内存并将字符串复制到其中,或者只使用std::string
,这样就不会出现任何类型的问题
调用sqlite3\u prepare\u v2
成功的原因是返回到\u bytes
的字符串仍然存在。当语句结束时,该字符串将被销毁,因此当res
被分配sqlite3\u prepare\u v2
的返回值时,不会在之前,因此调用成功,作为指向stri的有效指针ng通过了
尽管如此,请升级您的编译器。但是为什么调用“sqlite3\u prepare\u v2()”成功了?另外,请检查我的编辑-我正在添加更多代码。Thx。现在一切正常。将“sqlite3\u bind\u text()”最后一个参数更改为“SQLITE\u TRANSIENT”修复了这个问题。出于某种原因,我非常确定我需要SQLITE\u STATIC.Thx,并祝新年快乐。但是,为什么调用“sqlite3\u prepare\u v2()”成功了?另外,请检查我的编辑-我正在添加更多代码。Thx。现在一切正常。将“sqlite3\u bind\u text()”最后一个参数更改为“SQLITE\u TRANSIENT”修复了这个问题。出于某种原因,我非常确定我需要SQLITE_STATIC.Thx,新年快乐。