[英]memset of allocated memory after std::vector::reserve
[英]std::vector reserve method fails to allocate enough memory
我的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中使用它。
任何幫助深表感謝。 謝謝
因為segfault是在malloc中,所以很可能其他一些代碼已經破壞了堆(即寫入它們不擁有並被堆管理器使用的內存部分)。
我建議使用Valgrind來查找丟棄堆的代碼。
如果您不能使用Valgrind來查明內存因其負載過重而損壞的位置,您仍然可以使用更輕的解決方案進行測試。
對於Valgrind不適用的服務器應用程序(因為該平台在Solaris 8上),我使用mpatrol( http://mpatrol.sf.net )得到了相當不錯的結果,但特別是dmalloc( http://dmalloc.com )。
在某種程度上,您可以使用它們而無需重新編譯(只需重新鏈接dmalloc,mpatrol的庫預加載)。 他們將替換內存原語以對內存使用執行額外檢查(這些原語的錯誤參數,逐個讀取,堆損壞......)其中一些檢查將在問題發生時准確觸發而其他檢查將比實際的壞代碼觸發一點。 通過調整啟用哪些檢查,以及適用的檢查頻率,您可以在執行基本檢查時以幾乎全速運行。
我建議使用dmalloc重新編譯以獲得所謂的'FUNC_CHECK',對我而言,這增加了很多錯誤定位的准確性,而且性能成本可以忽略不計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.