问题描述
|
我在二叉搜索树的构造函数中遇到一个奇怪的错误。该项目适用于霍夫曼编码方案,但是问题是每当我在STL优先级队列中插入两个以上的项目时,复制构造函数就会崩溃。
void copyTree(myTreeNode* & copy,myTreeNode* originalTree)
{
cout<<\"copy tree was just called\"<<endl;
if(originalTree==NULL)
{
copy=NULL;
}
else
{
copy=new myTreeNode();
//the constructor crashes on the third insertion here at this point
copy->data=originalTree->data;
copyTree(copy->left,originalTree->left);
copyTree(copy->right,originalTree->right);
}
}
myTree (const myTree & copy)
{
this->root=NULL;
this->copyTree(this->root,copy.root);
}
//main
priority_queue<myTree,vector<myTree>,treeCompare> treeQueue;
map<char,int> occurrenceTracker;
char character;
cin>>character;
occurrenceTracker[character]=1;
while(cin>>character&&character!=\'e\')
{
if(occurrenceTracker.find(character)!=occurrenceTracker.end())
{
occurrenceTracker[character]++;
}
else
{
occurrenceTracker[character]=1;
}
}
map<char,int>::iterator itr;
for(itr=occurrenceTracker.begin();itr!=occurrenceTracker.end();itr++)
{
myTree characterTree;
treeNodeClass mapItem(itr->first,itr->second);
characterTree.insert(mapItem);
treeQueue.push(characterTree);
}
我进入了调试器,发现有两个或更少的问题,一切都很好。复制构造函数被调用了大约八次,但我不确定这是否完全正常。这是程序的堆栈跟踪
Hoffman Encoding.exe!`main\'::`4\'::myTree::copyTree(main::__l3::myTreeNode * & copy,main::__l3::myTreeNode * originalTree) Line 195 + 0x8 bytes C++
Hoffman Encoding.exe!`main\'::`4\'::myTree::copyTree(main::__l3::myTreeNode * & copy,main::__l3::myTreeNode * originalTree) Line 197 C++
Hoffman Encoding.exe!`main\'::`4\'::myTree::myTree(const main::__l4::myTree & copy) Line 205 C++
Hoffman Encoding.exe!??$_Debug_lt_pred@VtreeCompare@?4?main@VmyTree@?3?main@V2?3?main@@std@@YA_NVtreeCompare@?4??main@@9@AAVmyTree@?3??2@9@1PB_WI@Z(main::__l5::treeCompare _Pred,main::__l4::myTree & _Left,main::__l4::myTree & _Right,const wchar_t * _File,unsigned int _Line) Line 674 + 0x14 bytes C++
Hoffman Encoding.exe!??$_Debug_heap@V?$_Deque_unchecked_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@@std@@VtreeCompare@?4?main@@std@@YAXV?$_Deque_unchecked_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@@0@0VtreeCompare@?4??main@@9@@Z(std::?$_Deque_unchecked_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@ _First,std::?$_Deque_unchecked_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@ _Last,main::__l5::treeCompare _Pred) Line 2386 + 0x26 bytes C++
Hoffman Encoding.exe!??$push_heap@V?$_Deque_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@@std@@VtreeCompare@?4?main@@std@@YAXV?$_Deque_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@@0@0VtreeCompare@?4??main@@9@@Z(std::?$_Deque_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@ _First,std::?$_Deque_iterator@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@ _Last,main::__l5::treeCompare _Pred) Line 2490 + 0x82 bytes C++
Hoffman Encoding.exe!?push@?$priority_queue@VmyTree@?3?main@V?$deque@VmyTree@?3?main@V?$allocator@VmyTree@?3?main@@std@@@std@@VtreeCompare@?4?main@@std@@QAEXABVmyTree@?3??main@@9@@Z(const main::__l4::myTree & _Val) Line 343 + 0x5b bytes C++
Hoffman Encoding.exe!main(int argv,char * * argc) Line 333 C++
Hoffman Encoding.exe!__tmainCRTStartup() Line 555 + 0x19 bytes C
Hoffman Encoding.exe!mainCRTStartup() Line 371 C
kernel32.dll!76dc3677()
[Frames below may be incorrect and/or missing,no symbols loaded for kernel32.dll]
ntdll.dll!772e9f02()
ntdll.dll!772e9ed5()
当我取消注释析构函数时,代码可以正常工作,为什么会有这种想法?
析构函数在二进制文件的树根节点上调用此函数
void destroy(myTreeNode* aTreeNode)
{
if(aTreeNode!=NULL)
{
this->destroy(aTreeNode->left);
this->destroy(aTreeNode->right);
delete aTreeNode;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)