شرح - vector of vector c++



bad_alloc في ستد:: ناقلات البناء (1)

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 هو ببساطة std::vector::size_type من size_t . أنا لا أفهم لماذا بلدي محددة BUFCOUNT النتائج الثابتة في أن تدحرجت قيمة داخل داخل منشئ، ونقدر أي شخص مساعدتي في العثور على شيء واضح أنا في عداد المفقودين.


BUFCOUNT ليست static ، مما يعني أنها عضو بيانات مثيل (تماما مثل bufs1 ، bufs2 ، إلخ. يتم bufs2 على أعضاء البيانات غير الثابتة في ترتيب إعلانهم داخل الفصل، وهذا يعني أن bufs1 و bufs2 سيتم bufs2 به قبل BUFCOUNT . وبالتالي فإن bufs2 الأولي على bufs2 يستخدم قيمة bufs2 حتى الآن (بعبارة أخرى، لديه سلوك غير معرف).

لأنه يجعل من الصفر أن يكون كل كائن Outer تخزين نفس BUFCOUNT عدد صحيح داخله، قد ترغب في جعل BUFCOUNT ثابت.





stl