[英]std::bad_alloc when adding a struct to std::vector
這可能是愚蠢的,但我無法弄清楚。 我在以下代碼片段(這是開關中的case語句)中收到std::bad_alloc
異常:
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
該堆棧跟蹤沒有顯示任何使我相信push_back
某些部分正在請求大量內存的內容。
因此,這幾乎留下了您的程序在ELSE某個位置破壞堆的選項,而這種分配是受害者。 沒有更多的代碼和細節,我只能建議像valgrind這樣的內存檢查器。
MyStackItem
是否有銷毀您沒有向我們展示?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.