c++中的atoi导致分割错误

atoi in c++ results segmentaion error

本文关键字:分割 错误 中的 atoi c++      更新时间:2023-10-16

以下是一段代码,该代码假设测试与服务器的通信并从中获取图片:

bool testPICcomm(){
    Poco::Logger &logger = Poco::Logger::get("PictureTester");
    logger.setLevel(Poco::Message::PRIO_DEBUG);
    HttpClient* h = new HttpClient(host, 80);
    std::map<std::string, std::string> headers;
    Poco::UTF8Encoding utf;
    Encoder encoder(utf);

     h->connect();
     h->sendHttpRequest(askForPic,"","",0,0);
     if((h->getHttpHeaders(headers, encoder)) == false)
         {
         logger.debug("Couldn't Retrieve Headers "+ false);
         h->close();
         return false;
         }
     logger.debug("got headers");
     //get head data
     std::string mime = headers["Content-Type"];
     logger.debug("mime type:"  + mime);
     logger.debug("length string: "  + std::string((headers["Content-Length"]).c_str()));
     int length= atoi((headers["Content-Length"]).c_str());
     logger.debug("pic length:" + length);
...

我在linux上使用eclipse(eclipse功能不太好,所以我只在控制台上工作)。

现在,通过跟踪记录器消息,我推断atoi(查看代码的末尾)会导致分段错误。

考虑到另一个函数testXMLcomm运行良好并且看起来很相似,这真的很奇怪。

我当然包括了stdio和stdlib。

请帮忙!!!

我预计崩溃发生在logger.debug("pic length:" + length);行。您在指向字符串文字的指针中添加了一个偏移量为length的整数,并得到了一个无人区的地址。

你可能想写这样的东西:

ostringstream ss("pic length: ");
ss << length;
logger.debug(ss.str());

或者logger.debug("pic length: " + boost::lexical_cast<string>(length));,或者C++11具有std::to_string(length)

想象一下std::map headers中没有键"Content-Length"。你的方法不是故障保护的。

请改用find函数来检索元素的迭代器。在对迭代器的内容进行操作之前,请先测试迭代器。

有关示例,请参见http://www.cplusplus.com/reference/stl/map/find/

但是,分割错误不可能是这一点的结果(请参阅注释)