【问题标题】:Read access violation in string destructor字符串析构函数中的读取访问冲突
【发布时间】:2018-04-25 17:56:34
【问题描述】:

字符串析构函数怎么可能抛出异常? 它在变量 s 的 try 块末尾抛出。

Environment *env = Environment::createEnvironment(Environment::DEFAULT);
Connection *con;
con = env->createConnection(Config::login, Config::password, Config::connection_string);


string sqlStmt = "SELECT user FROM dual";
auto stmt = con->createStatement(sqlStmt);
ResultSet *rset = stmt->executeQuery();
try {
    rset->next();
    string s = rset->getString(1);
    cout << "user: " << s << endl;
}  // exception thrown here

读取访问冲突 _Pnext 为 0xFFFFFFFFFFFFFFF

【问题讨论】:

  • 这是一个空指针。
  • 由于sauto,我们只能猜测它是什么类型。你怎么知道它是一个字符串而不是一个指向临时缓冲区的指针?
  • 赤裸裸的rset-&gt;next() 是不明智的。 rset 应该在此之前检查,更重要的是,if (rset-&gt;next()) { ..your code.. } 是保护你自己的常用作案手法。不相关,如果你正在使用它,这值得 mysql 标签(我假设它是)。
  • @RichardCritten 为了清楚起见,我将auto 更改为std::string。经过测试,它做同样的事情。
  • @WhozCraig 为了提出这个问题,我已经简化了代码。我检查rset 在生产中是否良好。

标签: c++ oracle exception occi


【解决方案1】:

问题在于不同版本的 CRT 库。您的应用程序和 Oracle 的 CRT 库版本必须匹配。

【讨论】:

    【解决方案2】:

    看起来不像是 std::string 异常。

    赤裸裸的 rset->next() 是不明智的。 rset 应该在此之前检查,更重要的是,如果 (rset->next()) { ..your code.. } 是保护你免受自己伤害的常用作法。

    检查一下:

    if (rset->next() == Status::DATA_AVAILABLE) {
       auto s = rset->getString(1);
    } 
    

    【讨论】:

      猜你喜欢
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2019-04-05
      相关资源
      最近更新 更多