这是MSVC 2010中的错误还是我做错了什么?

时间:2016-12-29 04:02:33

标签: c++ visual-studio-2010 c++11

请考虑以下代码段:

在database_sqlite.h中:

  var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
  var data = dataRange.getValues();
  var lastRow = data[data.length-1];
  var headers = data[0];

   for (var row=1; row < data.length; row++) {
    var e = {};
    e.values = data[row].filter(Boolean);  
    e.range = dataRange.offset(row,0,1,data[0].length);
    e.namedValues = {};
    // Loop through headers to create namedValues object
    // NOTE: all namedValues are arrays.
    for (var col=0; col<headers.length; col++) {
      e.namedValues[headers[col]] = [data[row][col]];
    }
   }

在database_sqlite.cpp中:

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;
};

char * result_query = sqlite3_expanded_sql(stmt);                     res = sqlite3_step(stmt);

这里* result_query包含=“SELECT * FROM”sys.abcattbl“WHERE”abt_tnam“=''AND”abt_ownr“='';” 我正在使用MSVC2010,令我惊讶的是,“* name”包含空字符串。第一次调用“to_bytes()”成功,因为我可以检查将要使用的查询。

第一次调用“to_bytes()”后,我是否需要做一些事情?或者我只需要升级编译器?

1 个答案:

答案 0 :(得分:0)

不,你做错了什么。

我现在实际上并不是to_bytes返回的内容,但我认为它是std::basic_string上的类型基础,因此std::string和家人。

to_bytes向该字符串实例返回一个临时对象,因此当您调用c_str()时,您将获得一个指向字符串的第一个字符的指针,该字符在语句结束后将不再存在。你基本上有未定义的行为,因为name是一个悬空指针而你试图输出它。

您必须分配内存并将字符串复制到其中,或者只使用std::string,其中不会出现类型的问题。

您对sqlite3_prepare_v2的调用成功的原因是to_bytes返回的字符串仍然存在。语句结束时,字符串将被销毁,因此在为res分配返回值sqlite3_prepare_v2时。不是之前,因此调用成功,因为传递了一个到字符串的有效指针。

尽管如此,请升级您的编译器。