我的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
调用构造函数会导致segfault,并带有以下我从其核心转储中获得的堆栈跟踪:#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中使用了它。
任何帮助深表感谢。
谢谢
最佳答案
如果您不能使用Valgrind找出内存由于重载而损坏的位置,则仍然可以使用较轻的解决方案进行测试。
对于Valgrind不适用的服务器应用程序(因为该平台在Solaris 8上),我使用mpatrol(http://mpatrol.sf.net)取得了很好的效果,尤其是dmalloc(http://dmalloc.com)。
在某种程度上,您可以使用它们而无需重新编译(仅对于dmalloc重新链接,对于mpatrol进行库预加载)。他们将替换内存原语以对内存使用情况进行额外的检查(这些原语的错误参数,一一读取,堆损坏等)。其中某些检查将在问题发生时完全触发,而其他检查将在发生问题时完全触发。会比实际的错误代码晚一点触发。通过调整启用了哪些检查以及检查频率(如果适用),可以在执行基本检查时以几乎全速运行。
我建议使用dmalloc重新编译以获得所谓的“FUNC_CHECK”,对我而言,这可以以可忽略的性能成本提高错误发现的准确性。
关于c++ - std::vector reserve method fails to allocate enough memory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1962959/