将结构添加到std :: vector时的std :: bad_alloc

Pet*_*erK 2 c++ stl vector bad-alloc

这可能是愚蠢的事,但我无法弄清楚.我std::bad_alloc在以下代码片段中获得异常(这是交换机中的case语句):

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

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

至于MyNodenad 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() {}
    };
Run Code Online (Sandbox Code Playgroud)

希望这是所有需要的相关信息.我知道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
Run Code Online (Sandbox Code Playgroud)

Mar*_*k B 6

这个堆栈跟踪没有显示任何会让我相信某些部分push_back正在请求大量内存的东西.

因此,这几乎留下了一个选项,即你的程序在某个地方损坏了堆ELSE并且这个分配是受害者.没有更多的代码和细节我可以建议像valgrind一样的内存检查器.

请问MyStackItem你有没有向我们展示一个毁灭?

  • 标记为已接受的答案。当我清理并重建解决方案时,问题就消失了。经过一段时间的调试后开始发生非常奇怪的事情(例如 push_back 插入 4 个具有单元化(0xcd ...)值的元素。)。似乎 VS 在这里失败了。 (2认同)