2011-11-13 91 views
3

如何刪除已分配給陣列modelsnames的內存?我嘗試了每種方法,但運行時總是崩潰。刪除數組指針?

int main() 
{ 

    vector<Person*> people; 

    const int PERSON_SZ = 4; 
    char * names[] = {"Jim", "Fred", "Harry", "Linda"}; 
    int ages[] = { 23, 35, 52, 59 }; 

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

     Person * temp = new Person(names[i], ages[i]); 
     people.push_back(temp); 
    } 

    // A vector of Car pointers 
    vector<Car*> cars; 

    const int CAR_SZ = 3; 
    char * models[] = { "Festiva", "Ferrarri", "Prius" }; 
    srand(time(0)); 
    for (int i = 0; i < CAR_SZ; i++) 
    { 

     Car * temp = new Car(models[i]); 
     temp->set_driver(people[rand() % (people.size())]); 
     temp->set_owner(people[rand() % (people.size())]); 
     cars.push_back(temp); 
    } 



    for (int p = 0; p < people.size(); p++) 
    { 
     people[p]->increment_age(); 
    } 

    for (int c = 0; c < cars.size(); c++) 
    { 
     cars[c]->print(); 
    } 

    delete [] names; 
    for (int r = 0; r < CAR_SZ; ++r) 
     { 
      delete [] models[r]; 
     } 
    return 0; 
} 
+1

避免指針可以簡化這些代碼,並且會大大減少錯誤發生的機率。 –

回答

3

你沒有分配modelsnames使用new,所以你不能delete他們。

這兩個數組都分配在堆棧上,並在函數返回時自動刪除。

(字符串)數組的內容(即它自己的字符串)存儲在全局數據段中,根本無法釋放。這也會很危險,因爲編譯器可能會在程序的不同位置使用相同的字符串常量。

2

models array和names array都是靜態分配的。你沒有使用new來創建它們,你不需要刪除它們。你應該,但是,如下改變自己的類型:

const char * names[] = {"Jim", "Fred", "Harry", "Linda"}; 
const char * models[] = { "Festiva", "Ferrarri", "Prius" }; 

,因爲它們是指向字符串常量,它是隻讀的。

+0

那麼我應該刪除什麼?因爲有14泄漏對象,當我在003E3BA8(大小8,00402A43)在003E3C08 泄露對象(大小18,00432389)在003E3C48 泄露對象(大小8,00402A43) 泄露對象運行它 泄露對象在003E3C78(大小18,在003E3BD8(大小8,00402A43)在003E3CB8(大小20,00432389)在003E3CF8(尺寸12 泄露對象 泄露對象,00402C3B)在003E3D60(尺寸21 泄露對象,00432389) 00432389) 泄露對象漏對象在003E3DA0(尺寸12,h28.cpp:182) 003E3E08(尺寸18,00432389)的泄漏物體 003E3E48(尺寸12,00402C3B)的泄漏物體 *** 14發現泄漏 –

+0

使用此代碼刪除矢量指針...感謝幫助我(int c = 0; c

1

名稱和模型沒有指向堆分配區域。不要刪除它。

2

變量namesmodels不是動態分配的,也不是這些數組中的數據。所以不需要釋放它們或它們的內容。

這兩個vector包含另一方面需要free'd的數據。

+0

如何刪除矢量點?我應該創建一個循環並刪除矢量內的每個項目? –

+0

@RichardNguyen是的,你就是這麼做的。 –

1

您的代碼不完整。它不會編譯。請爲您的編譯器啓用所有警告和調試,例如與g++ -Wall -g如果使用GCC和改善你的代碼,直到你得到任何警告

char * names[] = {"Jim", "Fred", "Harry", "Linda"}; 
delete [] names; 

這是不正確。你只能通過delete得到你通過new獲得的東西。

+0

好吧,我沒有包括人和汽車類頭是y –

2

您沒有分配namesmodels。你不需要從內存中釋放或delete

2

正如其他人回答,這既不要求也不合法...

delete [] names; 

因爲你沒有newnames

這也不是...

for (int r = 0; r < CAR_SZ; ++r) 
{ 
    delete [] models[r]; 
} 

因爲你沒有new任何models的。

但是你仍然有一些內存泄漏!

對於每個car比如你new編輯並保存在carsvector,你需要調用delete。這裏有一種方法:

for (std::vector<Car*>::iterator car = cars.begin(), done = cars.end(); car != done; ++car) 
{ 
    delete *car; 
} 

注意,*有指針引用iterator,得到原始指針你new版。

這種方法的問題是,它留下了一個充滿懸掛指針的vector。您可以在循環中重置它們,或者在循環終止之後clear()vector。也許是更好的辦法是:

while (not cars.empty()) 
{ 
    delete cars.back(); 
    cars.pop_back(); 
} 

哪個delete s各自car,然後刪除該vector它的指針。

同樣,對於每個personnew編輯並保存在people

while (not people.empty()) 
{ 
    delete people.back(); 
    people.pop_back(); 
} 

作爲一個經驗法則,應該有一個delete,每new和一個delete[]爲每new ... []。但你會很好地瞭解smart pointers