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