1. 程式人生 > >QT | 已解決:pure virtual method called ,terminate called without an active exception

QT | 已解決:pure virtual method called ,terminate called without an active exception

在模擬一個編輯器時,在實現高亮時,針對每種程式語言,都新建一個類繼承了QSyntaxHighlighter高亮類。

接著在mainWindow中設定每個程式語言的選單項,都設定為可選擇型。

mainWindow中宣告一個QSyntaxHighlighter類的指標highlighter,每個曹函式中,如果選項沒有被選中,則呼叫解構函式,取消對應程式語言的高亮。

/**選擇C/C++高亮*/
void MainWindow::on_actionC_C_triggered(bool checked)
{
    if(checked){
        highlighter=new SyntaxhighlighterC(ui->textEdit->document());
    }else{
        if(!highlighter)
            highlighter->~QSyntaxHighlighter();//取消高亮
    }
}

/**java高亮*/
void MainWindow::on_actionJava_triggered(bool checked)
{
    if(checked){
        highlighter=new SyntaxhighlighterJava(ui->textEdit->document());
    }else{
        if(!highlighter)
            highlighter->~QSyntaxHighlighter();//取消高亮
    }
}


/**bash高亮*/
void MainWindow::on_actionBash_triggered(bool checked)
{
    if(checked){
        highlighter=new SyntaxhighlighterBash(ui->textEdit->document());
    }else{
        if(!highlighter)
            highlighter->~QSyntaxHighlighter();//取消高亮
    }
}
執行程式後,如果多次選擇取消不同的程式語言,會出現問題:pure virtual method called ,terminate called without an active exception,程式自動退出了。

猜想是因為highlighter只有一個,在多次選擇取消的操作下,可能會在highlighter已經被析構後沒有new的情況下,再次析構,所以才產生這個問題。故如上程式碼進行修改。

執行後OK.