std :: vector reserve方法无法分配足够的内存

red*_*ver 2 c++ linux memory-management segmentation-fault stdvector

我的C++应用程序中有一个缓冲类,如下所示:

class Buffer
{
    public:
    Buffer(size_t res): _rpos(0), _wpos(0)
    {
        _storage.reserve(res);
    }

    protected:
    size_t _rpos, _wpos;
    std::vector<uint8> _storage;
}
Run Code Online (Sandbox Code Playgroud)

有时使用构造函数失败,因为它无法分配所需的内存空间.例如,一次调用构造函数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>
Run Code Online (Sandbox Code Playgroud)

我使用GCC 4.4.2作为64位应用程序编译了这个应用程序,我在Debian 5 x64中使用它.

任何帮助深表感谢.谢谢

R S*_*hko 8

因为segfault在malloc中,所以很可能其他一些代码已经破坏了堆(即写入它们不拥有并且正由堆管理器使用的内存部分).

我建议使用Valgrind来查找丢弃堆的代码.