这可能是愚蠢的事,但我无法弄清楚。我在以下代码片段中获得了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
答案 0 :(得分:6)
该堆栈跟踪没有显示任何会让我相信push_back
的某些部分请求大量内存的内容。
因此,这几乎留下了一个选项,即你的程序在某个地方损坏了堆ELSE并且这个分配是受害者。如果没有更多的代码和细节我可以建议像valgrind那样的内存检查器。
MyStackItem
是否有您未向我们展示的破坏?