我有以下代码:
bool ok;
bson_t * query = bson_new();
BSON_APPEND_BINARY(query, "_id", BSON_SUBTYPE_BINARY, client_id, CLIENT_ID_SIZE);
bson_t * update = bson_new();
bson_t update_ch1;
BSON_APPEND_DOCUMENT_BEGIN(update, "$set", &update_ch1);
BSON_APPEND_UTF8(&update_ch1, "est", "something");
bson_append_document_end(update, &update_ch1);
bson_t * fields = bson_new();
bson_t reply;
bson_error_t error;
ok = mongoc_collection_find_and_modify(
client_collection,
query,
NULL,
update,
fields,
false, // remove
false, // upsert
false, // new
&reply,
&error
);
if (!ok)
{
fprintf(stderr, "Failed to update client collection in database: %s\n", error.message);
}
bson_destroy(fields);
bson_destroy(update);
bson_destroy(query);
bson_destroy(&reply); <---- Core dump here
问题是它偶尔会崩溃。通过分析核心转储,可以追溯到数据库连接问题。在这种情况下,ok
设置为false
并error.message
显示“未找到合适的服务器(serverselectiontryonce
设置)...”。
不幸的是,代码崩溃了bson_destroy(&reply);
- 显然reply
bson 没有分配 b/c 与数据库连接的错误。这意味着 mongoc_collection_find_and_modify() 在这种情况下无法初始化该字段。
问题是如何可靠地检测到这种情况并跳过bson_destroy()
呼叫。
例如(伪代码):
if (initilized(&reply)) bson_destroy(&reply);