奕志 發問時間: 電腦與網際網路程式設計 · 1 0 年前

C++使用new的問題

最近學校C++教到new的地方

有幾個問題不太懂

1.

一個用new創造出來的陣列,不管有多大,記憶體位置一定連續嗎?

2.

我想寫一個程式,有資料的新增、修改、刪除等功能

一開始架構是這樣的

int n,*p;

cout << "輸入一開始資料個數:";

cin >> n;

for(int i=0;i<n;i++){

p=new int;

}

用new int[n]這樣很難新增資料或刪除某一筆

所以我用for迴圈一個一個new

但是這樣new出來的記憶體不一定會連續

後來又想了一個方法,寫一個class

class int2

{

int a;

int *next;

};

然後迴圈裡面改成p=new int2,再用int2裡面的next指標把它們一個接一個串聯起來

但是這樣也好麻煩,而且記憶體使用變兩倍(a和*next)

假如要修改第五筆資料要寫

*p.next.next.next.next=5;

有沒有比較好的方法能提供給我

還請各位高手指教

已更新項目:

to:deepdish ( 研究生 5 級 )

第一題大概是懂了,意思應該是說

記憶體如果沒有足夠的大小可以連續,就會new不出來並且回傳NULL

2 個已更新項目:

第二題的程式只是表達一個想法,應該都不能執行= =

原本想說開始新增100筆資料,使用new一個int陣列,例如這樣

int *p=new int[100]

但是new完陣列後,假如要再新增3筆資料就會很困難,例如以下的超爛方法

save(p);  //儲存100筆資料

delete [] p;

p=new int[103];

load(p);  //讀取100筆資料,後面3筆空白

有沒有一個好一點的方法可以改善...

3 個已更新項目:

看完你的pdf檔學到蠻多的,以前沒學過malloc和free

4 個解答

評分
  • Dave
    Lv 7
    1 0 年前
    最佳解答

    通常當你需要 resize 你用 new allocate 出來的記憶體區塊,但又要保持其連續性,你會先用 new allocate 出較大的記憶體區塊,把舊的區塊中的重新 copy 進新的記憶體裡,再把舊的區塊 free 掉… (所以在動作中會有一度需要近兩倍大的記憶體大小;但只是暫時的)

    有些會動態變大變小的 stack / queue class 就是這樣作的…

    2007-10-24 14:50:49 補充:

    (C 裡面也有 realloc 可以試著在已被 allocate 記憶體區塊後再多加你要的大小)

    2007-10-24 16:11:22 補充:

    加大,縮小的 heuristic 可以這樣寫:要是記憶體全部被用滿了,就重新 allocate 一個 2 倍大的,要是記憶體少於 1/4 有被用到,就縮小為原本的 1/2 … (要是已縮小為最小的 size,就不要再縮小)

    • 登入以對解答發表意見
  • SiYu
    Lv 5
    1 0 年前

    class int2

    {

    int a;

    int *next;

    };

    這是link list 的寫法.真不簡單. 您自己想出來這種方法.

    • 登入以對解答發表意見
  • Ashley
    Lv 7
    1 0 年前

    1. new 使用指標來連接資料,所以你的擔心是多餘的,

    如果 new 陣列和普通陣列一樣就不用 new 了,

    所以只要記憶體空間足夠,就可以 new,否則回傳 NULL(0),重要的程式必須檢查回傳值

    你唯一要擔心的是,動態記憶體配置並不遵守範圍規則,

    所以使用之後必須手動釋放記憶體空間,

    覺得麻煩的話,請改用 JAVA 或 C#.NET有垃圾回收機制的語言

    2. 請改用一般 new 會使用的方法= =http://hungming.ct.ntust.edu.tw/2006spring/ct3407/...

    • 登入以對解答發表意見
  • 看不太懂你到底要做什麼, 你的目的是什麼? 但是你的寫法會造成很嚴重的系統問題(memory leak). 你建出來的pointer在你的例子裏沒有release pointer的動作.

    • 登入以對解答發表意見
還有問題?馬上發問,尋求解答。