【问题标题】:C++ program crashing for a string concatenation.C++ 程序因字符串连接而崩溃。
【发布时间】:2013-07-23 06:45:39
【问题描述】:

这是导致崩溃的行:

if (size <= 0)
        return;
    if (data)
    {
        std::string sData = std::string((char*)data, size);
        buffer += sData;  <-- This is the line causing crash
        processBuffer();
    }
    else
        return;

这是堆栈跟踪:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1282016352 (LWP 27952)]
0x002b48ec in memcpy () from /lib/tls/libc.so.6
(gdb) bt
#0  0x002b48ec in memcpy () from /lib/tls/libc.so.6
#1  0x001fea31 in std::string::_Rep::_M_clone () from /usr/lib/libstdc++.so.6
#2  0x001fef2e in std::string::reserve () from /usr/lib/libstdc++.so.6
#3  0x001ff83d in std::string::append () from /usr/lib/libstdc++.so.6
#4  0x001ff9e2 in std::string::operator+= () from /usr/lib/libstdc++.so.6
#5  0x003fc6c8 in StreamDecoder::StreamDecoderEncoder::addData 
    at src/StreamDecoder.cpp:171 

我已经验证data 不为空,并且缓冲区是一个声明为该类的私有成员变量的字符串。

我不知道为什么 memcpy 有段错误。这里可能出了什么问题?

【问题讨论】:

  • 试试 valgrind,也许你不小心覆盖了 buffer 的内部结构。
  • @JoachimPileborg 这是一个字符串。
  • @arne 是的,这可能是个问题。我会仔细看看的。谢谢。
  • 您确定StreamDecoderEncoder 对象是有效对象吗? IE。您没有使用空指针或指向无效对象的指针/引用(例如,指向另一个函数中的局部变量的指针/引用)?
  • @JoachimPileborg 我使用了正确的指针。但我认为buffer 中有垃圾。我使用了 clear() 函数,这似乎已经解决了这个问题。

标签: c++ debugging gcc segmentation-fault memcpy


【解决方案1】:

几个月前我在一个学校项目中遇到了这个问题......如果字符串变得很大,它可能会导致段错误。尝试改用ostringstream 之类的东西。

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多