首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 編譯錯誤:未聲明的標識符 choice 及 delete 非指標對象解析

     編輯:程式設計綜合問答

錯誤現象

編譯器報錯:choice: 未聲明的標識符、delete: 不能刪除不是指針的對象。程式碼中在 while 迴圈內部用 new 動態配置陣列,但在迴圈外嘗試 delete[],導致作用域問題。

問題程式碼片段

int _tmain(int argc, _TCHAR* argv[])
{
    // ...
    while(1)
    {
        // ...
        int *choice = new int[num_choice]; // 區域變數,作用域僅限 while 區塊
        double *quantity_choice = new double[num_choice];
        // ...
    } // 這裡 choice、quantity_choice 已離開作用域,無法在外部 delete

    delete[] choice; // 錯誤:找不到 choice
    choice = NULL;
    delete[] quantity_choice; // 錯誤:同上
    // ...
}

修正方法

  1. 將指標宣告移至迴圈外部,使其在整個函數作用域內可見。
  2. 在迴圈內僅進行配置,不重複宣告型別。
  3. 在 switch 中加入 default 分支,避免函數無返回值。

修正後程式碼

int _tmain(int argc, _TCHAR* argv[])
{
    int *choice = nullptr;          // 1. 宣告於外部
    double *quantity_choice = nullptr;

    while(1)
    {
        // ...
        choice = new int[num_choice];        // 2. 僅配置,不重複 int*
        quantity_choice = new double[num_choice];
        // 使用 choice、quantity_choice...
        
        // 若迴圈可能多次執行,記得先 delete 舊記憶體再新配置
        // delete[] choice; 
        // choice = new int[num_choice];
    }

    delete[] choice;               // 3. 迴圈外可正常釋放
    choice = nullptr;
    delete[] quantity_choice;
    quantity_choice = nullptr;
    // ...
}

// cal 函數補上 default
double cal(int num, double quantity)
{
    switch(num)
    {
        case 0: return quantity * 1.50;
        // ... 其他 case ...
        default: return 0.0; // 防止無返回值
    }
}

關鍵點總結

  • C++ 變數作用域以 {} 為界,迴圈內宣告的變數迴圈結束即銷毀。
  • delete[] 只能釋放由 new[] 配置的記憶體,且指標必須在作用域內。
  • 良好習慣:指標初始化為 nullptr,釋放後設為 nullptr,防止野指標。
  • 所有非 void 函數的所有路徑必須有返回值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved