curl_slist_free_all()导致GKE w / Debian 8.7上的段错误

我已经为libcurl封装了我在Google Container Engine上部署的C ++守护进程。 除了一个小问题之外,一切都很精彩。 无论何时调用curl_slist_free_all()它都会发生段curl_slist_free_all() 。 它不会在Ubuntu 14或16或MacOS上发生。 它只发生在Debian 8.7的GKE Docker环境中。 这实际上是我唯一的错误,几周来一直困扰着我。

我已经用RAII风格的容器包装资源句柄,以保证exception安全(是的,是的,我使用例外)和泄漏保护。 easy_init和easy_cleanup在CurlSession的构造函数和析构函数中。 global_init&cleanup在HTTP构造函数和析构函数中。

我validation了没有两个免费的情况,spelunked libcurl代码,仍然无法理解为什么这只发生在这个操作系统环境。 我设法附加一个debugging器,并将其隔离到单个slist清除调用。

唯一可以让我的代码工作的方法是在其他所有的env中泄漏,这不是一个交易的破坏者,而是我的记忆分析器给了我一个干净的健康法案。

任何见解或共享的痛苦感激。

我的标题slist包装:

 HTTP::Headers::Headers() : slist{nullptr} {} HTTP::Headers::Headers(const HeaderKeyValues &headers) : slist{nullptr} { for (const auto& header : headers) add(header.first, header.second); } HTTP::Headers::~Headers() { curl_slist_free_all(slist); // <- seems to crash on Google's Debian image slist = nullptr; }; void HTTP::Headers::add(const std::string& key, const std::string& value) { std::ostringstream os; os << key << ": " << value; slist = curl_slist_append(slist, os.str().c_str()); if (!slist) { LOG(fatal) << "Failed appending to header list"; throw std::runtime_error{"Failed appending to header list"}; } } 

调度员的子集:

 HTTP::Response HTTP::dispatch(const Request& req) const { CurlSession session; const auto handle = session.handle; Headers headerList{req.headers}; if (req.chunked) headerList.add("Transfer-Encoding", "chunked"); // more ... // if (headerList.notEmpty()) curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headerList.slist); // perform the actual request CURLcode result = curl_easy_perform(handle); 

我怀疑这是Docker构build镜像与仅在GKE上运行的Docker部署映像之间的某种微妙的不兼容性。