c++ - 在 Linux 中将数组复制到 vector 时出现段错误

标签 c++ linux segmentation-fault

我正在尝试调试为 Linux 编写的遗留代码。有时应用程序在到达以下方法中的 memcpy 调用时会出现段错误:

std::vector<uint8> _storage;
size_t _wpos;
void append(const uint8 *src, size_t cnt)
{
  if (!cnt)
  return;

  if (_storage.size() < _wpos + cnt)
    _storage.resize(_wpos + cnt);
  memcpy(&_storage[_wpos], src, cnt);
  _wpos += cnt;
}

取值如下:

_storage.size() is 1000
_wpos is 0
*src points to an array of uint8 with 3 values: { 3, 110, 20 }
cnt is 3

我不知道为什么会发生这种情况,因为此方法在应用程序运行时被调用了数千次,但有时会出现段错误。

有人知道如何解决这个问题吗?

最佳答案

就写入的数据而言,您的代码看起来不错。您绝对确定您传递的是正确的 src 指针吗?当您使用诸如 gdb 之类的调试器运行代码时会发生什么?它应该在段错误处停止,然后您可以打印出 _storage.size()srccnt 的值。

我相信您会发现(至少)其中一个与您的预期完全不同。您可能传递了无效的 src;您可能传递了一个大得离谱的 cnt

关于c++ - 在 Linux 中将数组复制到 vector 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912693/

相关文章:

c++ - 加速的 C++ 头文件不起作用

c++ - 如何加快C++中2D三角矩阵的内存分配?

c++ - GLUT 显示空白窗口

linux - 如何将 tiff 图像编译为单个文本文件中的 xyz 坐标?

c - 为什么这个程序会抛出段错误异常?

c++ - 另一个 boost 错误

c - 查找以字符 X 开头的所有后缀

linux - 为什么我不能使用下面的 shell 参数扩展提取主机名的最后三个字符?

我可以 mmap 长度大于文件大小的文件吗?

c++ - SIGSEGV 搜索(修改后的)双向列表时