gpt4 book ai didi

c++ - libpq 错误消息解除分配

转载 作者:行者123 更新时间:2023-11-30 02:58:22 25 4
gpt4 key购买 nike

这是一个愚蠢的问题。 libpqPQerrorMessage 函数返回一个 char const*

char const* msg = PQerrorMessage(conn);

既然它是 const,我认为我不应该解除分配它,而且我从未在任何示例中看到这样做。但是,它何时以及如何被释放?它怎么知道我何时使用完 msg 指针?

起初我以为一旦请求另一个错误消息它就会被释放,但事实并非如此。

// cause some error
char const* msg1 = PQerrorMessage(pgconn);

// cause another error
char const* msg2 = PQerrorMessage(pgconn);

// still works
std::cout << msg1 << msg2 << std::endl;

有人可以帮我解释一下吗?

编辑归功于 Dmitriy Igrishin

我在 postgresql 邮件列表上发布了这个,结果证明我最初的假设是正确的。
msg1 指针不应该是有效的,不知何故我很幸运。

编辑: 来自 postgresql 文档

PQerrorMessage

Returns the error message most recently generated by an operation on the connection.

char *PQerrorMessage(const PGconn *conn);

Nearly all libpq functions will set a message for PQerrorMessage if they fail. Note that by libpq convention, a nonempty PQerrorMessage result can consist of multiple lines, and will include a trailing newline. The caller should not free the result directly. It will be freed when the associated PGconn handle is passed to PQfinish. The result string should not be expected to remain the same across operations on the PGconn structure.

最佳答案

按照文档所说的去做,不要期望它的内容保持不变,只需将它们保存在 std::string 中而不是存储指针。

// cause some error
std::string msg1 = PQerrorMessage(pgconn);

// cause another error
std::string msg2 = PQerrorMessage(pgconn);

// works all the time
std::cout << msg1 << msg2 << std::endl;

关于c++ - libpq 错误消息解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com