0

我有以下代码:

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设置为falseerror.message显示“未找到合适的服务器(serverselectiontryonce设置)...”。
不幸的是,代码崩溃了bson_destroy(&reply);- 显然replybson 没有分配 b/c 与数据库连接的错误。这意味着 mongoc_collection_find_and_modify() 在这种情况下无法初始化该字段。
问题是如何可靠地检测到这种情况并跳过bson_destroy()呼叫。

例如(伪代码):

 if (initilized(&reply)) bson_destroy(&reply);
4

0 回答 0