【发布时间】:2010-12-30 02:18:19
【问题描述】:
我的 C++ 应用程序中有一个缓冲区类,如下所示:
class Buffer
{
public:
Buffer(size_t res): _rpos(0), _wpos(0)
{
_storage.reserve(res);
}
protected:
size_t _rpos, _wpos;
std::vector<uint8> _storage;
}
有时使用构造函数会失败,因为它无法分配所需的内存空间。例如,有一次,使用res = 37 调用构造函数导致了一个段错误,我从其核心转储中获得了以下堆栈跟踪:
#0 0x00007f916a176ed5 in raise () from /lib/libc.so.6
No symbol table info available.
#1 0x00007f916a1783f3 in abort () from /lib/libc.so.6
No symbol table info available.
#2 0x00007f916a1b33a8 in ?? () from /lib/libc.so.6
No symbol table info available.
#3 0x00007f916a1b8948 in ?? () from /lib/libc.so.6
No symbol table info available.
#4 0x00007f916a1bb17c in ?? () from /lib/libc.so.6
No symbol table info available.
#5 0x00007f916a1bca78 in malloc () from /lib/libc.so.6
No symbol table info available.
#6 0x00007f916ac0c16d in operator new (sz=37)
at ../../.././libstdc++-v3/libsupc++/new_op.cc:52
p = <value optimized out>
#7 0x00000000004e3d11 in std::vector<unsigned char, std::allocator<unsigned char> >::reserve (this=0x7f911bc49cc0, __n=31077)
at /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.2/../../../../include/c++/4.4.2/ext/new_allocator.h:89
__old_size = 0
__tmp = <value optimized out>
我使用 GCC 4.4.2 作为 64 位应用程序编译了这个应用程序,我在 Debian 5 x64 中使用它。
非常感谢任何帮助。 谢谢
【问题讨论】:
-
跟踪明确显示 res = 31077,而不是您声称的 37。它仍然很小(至少对于 64 位系统),但您可能在错误的地方寻找故障。你能从回溯中显示第 8 帧及以上的帧吗?
标签: c++ linux memory-management segmentation-fault stdvector