std :: bad_alloc при добавлении структуры в std :: vector - PullRequest
2 голосов
/ 21 апреля 2011

это, наверное, что-то глупое, но я не могу понять это. Я получаю исключение std::bad_alloc в следующем фрагменте кода (который является оператором case в переключателе):

case 0:
{
MyPrimitiveNode* node = new MyPrimitiveNode( 1, false );
TheStack.push_back( MyStackItem( node, TYPE_REF ) ); // bad_alloc here
break;
}

Где TheStack имеет тип MyStack, то есть typedef std::vector<MyStackItem> MyStack;

MyStackItem представляет собой простую структуру и выглядит следующим образом:

struct MyStackItem {
    MyNode* value;
    uint8_t type;

    MyStackItem() {
        value = NULL;
        type = TYPE_UNDEF;
    }

    MyStackItem( MyNode* val, uint8_t t ) {
        value = val;
        type = t;
    }
};

Что касается MyNode nad MyPrimitiveNode, они приходят из другого проекта (статическая библиотека) и определяются следующим образом:

class MyNode
        {
        public:
            MyNode() {}
            virtual ~MyNode() {}
        };

class MyPrimitiveNode : public MyNode
    {
    public:
        bool bDeclaration;
        uint32_t u32ObjectIdx;

        MyPrimitiveNode() {
                        bDeclaration = false;
                        u32ObjectIdx = 0;
                    }
        MyPrimitiveNode( uint32_t id, bool declaration ) {
                        bDeclaration = declaration ;
                        u32ObjectIdx = id;
                    }
        ~MyPrimitiveNode() {}
    };

Надеюсь, это вся необходимая информация. Я знаю, что MyStackItem делает только поверхностную копию, вот как я этого хочу. Не беспокойтесь об утечках, это делается в других местах.

Может кто-нибудь сказать мне, что происходит и как я могу это исправить? Спасибо.

РЕДАКТИРОВАТЬ: публикация трассировки стека может помочь:

>   myProgram.exe!std::_Construct<MyStackItem,MyStackItem>(MyStackItem* _Ptr=0x003d3de8, const MyStackItem& _Val={...})  Line 52 + 0x33 bytes   C++
    myProgram.exe!std::allocator<MyStackItem>::construct(MyStackItem* _Ptr=0x003d3de8, const MyStackItem& _Val={...})  Line 155 + 0xd bytes C++
    myProgram.exe!std::_Uninit_fill_n<MyStackItem*,unsigned int,MyStackItem,std::allocator<MyStackItem> >(MyStackItem* _First=0x003d3de8, unsigned int _Count=0x00000001, const MyStackItem& _Val={...}, std::allocator<MyStackItem> & _Al={...}, std::_Nonscalar_ptr_iterator_tag __formal={...}, std::_Nonscalar_ptr_iterator_tag __formal={...})  Line 400 + 0x10 bytes  C++
    myProgram.exe!stdext::unchecked_uninitialized_fill_n<MyStackItem*,unsigned int,MyStackItem,std::allocator<MyStackItem> >(MyStackItem* _First=0x003d3de8, unsigned int _Count=0x00000001, const MyStackItem& _Val={...}, std::allocator<MyStackItem> & _Al={...})  Line 922 + 0x43 bytes C++
    myProgram.exe!std::vector<MyStackItem,std::allocator<MyStackItem> >::_Ufill(MyStackItem* _Ptr=0x003d3de8, unsigned int _Count=0x00000001, const MyStackItem& _Val={...})  Line 1252 + 0x18 bytes    C++
    myProgram.exe!std::vector<MyStackItem,std::allocator<MyStackItem> >::_Insert_n(std::_Vector_const_iterator<MyStackItem,std::allocator<MyStackItem> > _Where={value={...} type=??? }, unsigned int _Count=0x00000001, const MyStackItem& _Val={...})  Line 1184 + 0x14 bytes C++
    myProgram.exe!std::vector<MyStackItem,std::allocator<MyStackItem> >::insert(std::_Vector_const_iterator<MyStackItem,std::allocator<MyStackItem> > _Where={value={...} type=??? }, const MyStackItem& _Val={...})  Line 878  C++
    myProgram.exe!std::vector<MyStackItem,std::allocator<MyStackItem> >::push_back(const MyStackItem& _Val={...})  Line 823 + 0x58 bytes    C++
    myProgram.exe!MethodWhereExceptionOccurs

1 Ответ

6 голосов
/ 21 апреля 2011

Эта трассировка стека не показывает ничего, что могло бы заставить меня поверить, что какая-то часть push_back запрашивает тонну памяти.

Следовательно, это в значительной степени оставляет возможность, что ваша программа повредила кучу где-то еще, и это распределение является жертвой. Без большего количества кода и деталей все, что я могу предложить, - это проверка памяти, такая как valgrind.

У MyStackItem есть разрушение, которое вы нам не показываете?

...