【发布时间】:2015-10-22 17:40:49
【问题描述】:
我很好奇为什么当我执行curl_easy_perform(m_curl); 时替代#1 功能正常,而替代#2 返回CURLE_OPT_MALFORMAT
备选方案#1
curl_easy_reset(m_curl);
char sUrl[8192];
/* In Alternative #1, m_strUrl is a C++ std::wstring member variable */
wcstombs(sUrl, m_sUrl.c_str(), m_sUrl.length());
sUrl[m_sUrl.length()] = '\0';
CURLcode code = curl_easy_setopt(m_curl, CURLOPT_URL, sUrl);
CURLcode perform = curl_easy_perform(m_curl);
备选方案#2
curl_global_init(CURL_GLOBAL_ALL);
/* init the curl session */
m_curl_handle = curl_easy_init();
/* set URL to get here*/
/* In Alternative #2, m_strUrl is a C++ std::string member variable */
CURLcode retval = curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char
*)m_sUrl.c_str());
CURLcode perform = curl_easy_perform(m_curl);
我阅读了以下网址
How to convert a std::string to const char* or char*?
如果您只想将std::string 传递给需要const char* 的函数,您可以使用
std::string str;
const char * c = str.c_str();
如果你想得到一个可写的副本,比如char *,你可以这样做:
std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
// don't forget to free the string after finished using it
delete[] writable;
编辑:请注意,上述内容不是异常安全的。如果在 new 调用和 delete 调用之间抛出任何东西,您将泄漏内存,因为没有任何东西会自动为您调用 delete。有两种直接的方法可以解决这个问题。
我想知道为什么当我这样做时替代 #2 会窒息:
CURLcode retval = curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char*)m_sUrl.c_str());
我是否有必要创建一个可写副本,例如 (char*) 与
std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
当我在 Windows 线程函数中使用时: curl_easy_setopt(m_curl_handle, CURLOPT_URL, (char*)m_sUrl.c_str()); 其次是: CURLcode retval = curl_easy_perform(m_curl);
Windows 线程函数在以下情况下提前终止: CURLcode retval = curl_easy_perform(m_curl) 这样我就无法读取与关联的 CURLcode curl_easy_perform(m_curl)。
非常感谢任何帮助
【问题讨论】:
-
问了 76 个问题,但您仍然不知道如何正确格式化它们?
-
@Praetorian,感谢您正确格式化我的问题。你能评论我的问题吗?非常感谢。
-
您可以使用
std::vector<char> writable(size);代替char *writable = new char[size];。这应该是异常安全的。 -
@rodrigo,感谢您的评论。我有一个问题问你。首先,我们如何将 std::vector
转换为 CURLcode 所需的 char* 指针 code = curl_easy_setopt(m_curl, CURLOPT_URL, sUrl);非常感谢。 -
@Frank:简单,使用
writable.data()成员函数。它返回一个char *。或者,您可以使用&writable[0],因为向量的内存是连续的。