libpq错误消息释放

时间:2012-12-04 17:56:43

标签: c++ libpq

这是一个愚蠢的问题。 libpq的{​​{1}}函数返回PQerrorMessage

char const*

既然它是char const* msg = PQerrorMessage(conn); ,我认为我不应该解除它,我从来没有在任何例子中看到过这种情况。但是,它何时以及如何被释放? 怎么知道我什么时候使用了我的const指针?

起初我认为一旦请求另一条错误消息就会解除分配,但事实并非如此。

msg

有人可以为我阐明这个吗?

编辑: Dmitriy Igrishin的学分

我在postgresql邮件列表上asked,结果证明我最初的假设是正确的 // cause some error char const* msg1 = PQerrorMessage(pgconn); // cause another error char const* msg2 = PQerrorMessage(pgconn); // still works std::cout << msg1 << msg2 << std::endl; 指针不应该有效,我不知何故幸运。

来自postgresql文档的

编辑

  

的PQerrorMessage

     

返回最近由连接上的操作生成的错误消息。

msg1
     

如果失败,几乎所有libpq函数都会为char *PQerrorMessage(const PGconn *conn); 设置一条消息。请注意,通过libpq约定,非空PQerrorMessage结果可以包含多行,并且将包含尾随换行符。调用者不应该直接释放结果。将关联的PQerrorMessage句柄传递给PGconn时,它将被释放。不应期望结果字符串在PQfinish结构的操作中保持相同。

2 个答案:

答案 0 :(得分:2)

正如文档所说,不要指望它的内容保持不变,只需将它们保存在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;

答案 1 :(得分:1)

一个库函数返回一个普通老指针到分配的内存是非常老派和C-ish,但仍然有很多它们。除了文档之外,没有办法知道库设计者的意图是将分配的存储的所有权转移到代码中。现代图书馆设计师可以返回shared_ptr&lt;&gt;使他们关于存储生命周期的意图完全清楚,或者将字符串包装为std :: string,它还处理封面下的分配和删除。

const char *声明并没有真正说明存储生命周期。相反,它说不要修改存储。对于返回已分配存储的旧式函数,您只需要知道删除存储与修改它不同。旧式函数可能想要返回一个const char *,让你知道只分配了这么多的存储位置,如果你写下来,就会出现混乱。

当然这个函数可能是从静态表返回数据,在这种情况下你既不应该写入也不应该删除它。再次,当你使用普通指针时,没有办法知道。