首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 指標記憶體配置策略:new 運算子 vs 指標遞增的正確性對比

     編輯:關於C語言

在 C++ 中動態配置記憶體時,選擇正確的位址分配方式至關重要。本文對比兩種常見寫法,揭示為何使用 new 獨立配置符合設計預期,而指標遞增(p++)會導致邏輯錯誤。

錯誤示範:指標遞增導致連續位址

#include <iostream>
using namespace std;

void main() {
    int *p = new int;
    cin >> *p;
    while (*p != 0) {
        cout << p;  // 輸出位址呈連續分佈(如陣列)
        p++;        // 指標遞增,指向下一個 int 位置
        cin >> *p;
    }
    cout << *p << endl;
}

問題分析:

  • p++ 使指標按 sizeof(int) 位元組遞增,產生連續記憶體區塊,類似陣列。
  • 這些記憶體未經配置,屬於未定義行為,極易導致程式崩潰或資料損毀。
  • 違反「每次輸入對應獨立記憶體區塊」的設計需求。

正確做法:每次迴圈獨立 new 配置

#include <iostream>
using namespace std;

void main() {
    int *p = new int;
    int *q;
    cin >> *p;
    while (*p != 0) {
        cout << p;  // 輸出位址為隨機分佈,符合預期
        q = new int;  // 每次獨立配置新記憶體
        p = q;        // p 指向新區塊
        cin >> *p;
    }
    cout << *p << endl;
}

優勢:

  • 每次 new int 向作業系統請求獨立記憶體區塊,位址隨機分佈。
  • 符合「隨機位址分配」的設計要求,避免未定義行為。
  • 記得在適當時機配合 delete 釋放記憶體(本範例為簡化省略)。

核心原則總結

操作記憶體分佈適用場景風險
p++ / p + i連續(陣列式)已知大小的連續資料結構(陣列、向量)若未配置足夠空間,存取越界導致 UB
每次 new 配置離散(隨機)動態數量、獨立生命週期的物件需手動管理釋放,否則記憶體洩漏

最佳實踐:現代 C++ 建議使用智慧指標(std::unique_ptr、std::shared_ptr)或容器(std::vector)自動管理記憶體,避免手動 new/delete 帶來的風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved