亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

c++析構函數問題

c++析構函數問題

C++
MOCKINGT 2017-09-13 09:44:22
#include<iostream> using?namespace?std; template<typename?T> class?Stack { public: ????Stack(int?size?=?0); ????~Stack(); ????bool?push(T?element); ????void?pop(T?&p); ????void?clearStack(); ????bool?isFull(); ????bool?isEmpty(); ????void?StackTraverse(); ????int?StackLength(); ????//char?operator[](int?index); private: ????T?*m_iStack; ????int?m_iSize; ????int?m_iTop; };? //template<typename?T> //char?Stack<T>::operator[](int?index) //{ //????return?(char)m_iStack[index]; //} template<typename?T> Stack<T>::Stack(int?size) { ????m_iSize?=?size; ????m_iStack?=?new?T[m_iSize]; ????m_iTop?=?0; } template<typename?T> Stack<T>::~Stack() { ????delete[]m_iStack; ????m_iStack?=?NULL; } template<typename?T> bool?Stack<T>::isFull() { ????return?m_iTop?==?m_iSize???true?:?false; } template<typename?T> bool?Stack<T>::isEmpty() { ????return?0?==?m_iTop???true?:?false; } template<typename?T> void?Stack<T>::pop(T?&p) { ????if?(!isEmpty()) ????{ ????????p?=?m_iStack[--m_iTop]; ????} ???? } template<typename?T> bool?Stack<T>::push(T?element) { ????if?(isFull()) ????{ ????????return?false; ????} ????m_iStack[m_iTop++]?=?element; ????return?true; } template<typename?T> void?Stack<T>::clearStack() { ????m_iTop?=?0; } template<typename?T> int?Stack<T>::StackLength() { ????return?m_iTop; } template<typename?T> void?Stack<T>::StackTraverse() { ????for?(int?i?=?--m_iTop;?i?>=?0;?i--) ????{ ????????cout?<<?m_iStack[i]?; ????} } int?main() { ????Stack<char>?*p?=?new?Stack<char>(30); ????Stack<char>?*pNeed?=?new?Stack<char>(30); ????char?a?=?0; ????char?N[]?=?"[()]"; ????char?CurrentNeed?=?0; ????for?(int?i?=?0;i?<?(int)strlen(N)?;?i++) ????{ ????????if?(N[i]?!=?CurrentNeed) ????????{ ????????????p->push(N[i]); ????????????switch?(N[i]) ????????????{ ????????????case?'[': ????????????????if?(CurrentNeed?!=?0) ????????????????{ ????????????????????pNeed->push(CurrentNeed); ????????????????} ????????????????CurrentNeed?=?']'; ????????????????break; ????????????case?'(': ????????????????if?(CurrentNeed?!=?0) ????????????????{ ????????????????????pNeed->push(CurrentNeed); ????????????????} ????????????????CurrentNeed?=?')'; ????????????????break; ????????????} ????????} ????????else ????????{ ????????????char?elem; ????????????p->pop(elem); ????????????pNeed->pop(CurrentNeed); ????????} ????????/*cout?<<?CurrentNeed?<<?"Current"?<<?endl; ????????p->StackTraverse(); ????????cout?<<?"p"?<<endl; ????????pNeed->StackTraverse(); ????????cout?<<?"pNeed"?<<endl;*/ ????} ????if?(p->StackLength()?==?0) ????????if?(pNeed->StackLength()?==?0) ????????????cout?<<?"匹配"?<<?endl; ????cout?<<?"不匹配"?<<?endl; ????delete?p;??//斷點調試 ????p?=?NULL; ????delete?pNeed; ????pNeed?=?NULL; ????system("pause"); ????return?0; }在斷點調試的時候說在p的析構函數上面發生異常,但是如果把注釋的那段注釋掉就不會出現問題,請問為什么?
查看完整描述

1 回答

已采納
?
onemoo

TA貢獻883條經驗 獲得超454個贊

StackTraverse 函數中,你是不是想讓 i 從 m_iTop-1 循環到 0 來依次打印整個棧?

如果是這樣的話,那 for 循環的初始部分?int?i?=?--m_iTop 就有問題了! ?這樣做雖然 i 確實初始化為 m_iTop-1,但是 m_iTop 也自減了!結果每調用一次?StackLength() 棧頂就同時減少一位,這不是你想要的結果吧。


事實上,105 行的 for 循環中,只要 107 行?N[i]?!=?CurrentNeed,就會先 push——棧頂+1,后?StackLength() 又會使棧頂減 1 重新變為 0。 而只要某一次循環時?N[i] ==?CurrentNeed,就會調用 pop,這會訪問?m_iStack[-1],恐怕這會引起問題。

查看完整回答
反對 回復 2017-09-13
  • 1 回答
  • 0 關注
  • 1208 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號