是MSVC 2010中的错误还是我做错了什么
Is it a bug in MSVC 2010 or I am doing something wrong?
请考虑以下代码段:
在database_sqlite.h中:
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;
};
在database_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 )
{
char *result_query = sqlite3_expanded_sql(stmt); res = sqlite3_step(stmt);
在这里 * result_query contains =" select * select * sys.abcattbl"其中" abt_tnam" ='''''''and abt_ownr" ='''';";我正在使用MSVC2010,令我惊讶的是,"*名称"包含空字符串。第一个呼吁" to_bytes()"成功,因为我可以检查将要使用的查询。
在第一次打电话给" to_bytes()"之后,我必须做些什么吗?或者我只需要升级编译器?
nope,你做错了什么。
我现在没有to_bytes
返回什么,但是我假设它是std::basic_string
上的类型基础,因此std::string
和family。
to_bytes
将临时对象返回到该字符串实例,因此,当您调用c_str()
时,您将指示指向字符串的第一个字符,该字符串在语句完成后不再存在。由于name
是一个悬空的指针,因此您基本上具有不确定的行为,并且您试图输出它。
您必须分配内存并将字符串复制到其中,或者仅使用std::string
,在哪里不会发生问题类型。
您呼叫sqlite3_prepare_v2
成功的原因是to_bytes
返回的字符串仍然存在。语句结束时,该字符串将被销毁,因此当res
分配sqlite3_prepare_v2
的返回值时。不是以前,因此呼叫成功,因为传递了一个有效的指针。
,尽管如此,请升级您的编译器。
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 我的C++线程做错了什么?
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- 没有输出的合并排序我做错了什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- FFMPEG,C++,内存泄漏,我做错了什么?
- 我做错了什么?反向字符串 C++
- 我在这个课上做错了什么?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 我做错了什么?GetDiskFreeSpaceExA的功能根本不起作用
- 我在查找和字符串上做错了什么?
- 我正在尝试用 c++ 制作一个日志记录框架,但信息没有传递给记录器的子组件,我做错了什么?
- 我在尝试将多个值push_back向量时出错。我做错了什么?
- 插入排序:我做错了什么?