簡體   English   中英

std :: vector構造函數中的bad_alloc

[英]bad_alloc in std::vector constructor

std::vector有一個構造函數,在其中傳遞一個size_type count的單個參數時,應該使用count缺省構造的元素對向量進行大小調整。 但是以下代碼在錯誤的轉換后失敗,並出現bad_alloc異常:

#include <vector>

struct Inner {
  int foo;
  char buf[256];
};

template <typename Type>
struct Outer
{
  typedef std::vector<Inner> BufContainer;
  typedef typename BufContainer::size_type BufIndex;
  BufContainer bufs1;
  BufContainer bufs2;
  const BufIndex BUFCOUNT = 32;

  Outer() :
    bufs1(32),       // fine
    bufs2(BUFCOUNT)  // bad_alloc
  { }
};

int main() {
  Outer<int> outer;
}

當我查看調試器時,可以看到在第二個向量構造函數上發生了錯誤的轉換:

#13 0x0000000000400bf1 in Outer<int>::Outer (this=0x7ffdc59570c0) at wtf.cc:22
22          bufs2(BUFCOUNT)
(gdb) down
#12 0x0000000000400d6e in std::vector<Inner, std::allocator<Inner> >::vector     (this=0x7ffdc59570d8, __n=140727918359008, __a=...) at /usr/local/gcc-4.9.1/include/c++/4.9.1/bits/stl_vector.h:278
278       : _Base(__n, __a)
(gdb) list
273        *  This constructor fills the %vector with @a __n default
274        *  constructed elements.
275        */
276       explicit
277       vector(size_type __n, const allocator_type& __a = allocator_type())
278       : _Base(__n, __a)
279       { _M_default_initialize(__n); }
(gdb) print __n
$1 = 140727918359008

std::vector::size_type只是來自size_t的typedef。 我不明白為什么我定義的常量BUFCOUNT會在構造函數內部產生該BUFCOUNT值,並且會感謝有人幫助我找到我所缺少的明顯東西。

BUFCOUNT不是static ,這意味着它是一個實例數據成員(就像bufs1bufs2等)。非靜態數據成員按照類中其聲明的順序進行初始化。這意味着bufs1bufs2 BUFCOUNT 之前進行初始化。的初始化bufs2因此使用的的尚未unitialised值BUFCOUNT (換言之,具有未定義行為)。

因為讓每個Outer對象在其中存儲相同的BUFCOUNT整數是零意義,所以您可能希望將BUFCOUNT靜態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM