C++ 字符串析构函数中的读取访问冲突

C++ 字符串析构函数中的读取访问冲突,c++,oracle,exception,occi,C++,Oracle,Exception,Occi,字符串析构函数如何可能引发异常? 它在变量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

字符串析构函数如何可能引发异常? 它在变量
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
Environment*env=Environment::createEnvironment(Environment::DEFAULT);
连接*con;
con=env->createConnection(配置::登录,配置::密码,配置::连接\u字符串);
字符串sqlStmt=“从双用户中选择用户”;
自动stmt=con->createStatement(sqlStmt);
结果集*rset=stmt->executeQuery();
试一试{
rset->next();
字符串s=rset->getString(1);

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

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

赤裸裸的rset->next()是不明智的。在进行任何操作之前,都应该检查rset,更重要的是,如果(rset->next()){..您的代码..}是保护您免受自己伤害的常用操作方式,则应检查rset

只要检查一下:

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

这是一个空指针。正如
s
auto
一样,我们只能猜测它是什么类型。你怎么知道它是一个字符串而不是指向临时缓冲区的指针呢?这种赤裸裸的
rset->next()
是不明智的。
rset
应该先检查一下,更重要的是,
if(rset->next()){..你的代码..}
是一种保护你免受自己伤害的股票操作方式。与此无关,如果你使用的是mysql标签,那么这是值得的(我假设是)@RichardCritten为了清楚起见,我已经将
自动
更改为
std::string
。测试了它,它做了同样的事情。@WhozCraig为了问这个问题,我简化了代码。我检查
rset
在生产中是否良好。