2017-04-01 46 views
0

我有一個動態分配的數組,我試圖從中刪除一個選定的對象。但我最終會發生內存泄漏。 陣列:嘗試刪除C++中的對象時發生內存泄露

Competitor* *person; 

被分配:

person = new Competitor*[capacity]; 
for (int i = 0; i < this->capacity; i++) { 
    person[i] = nullptr; 
} 

這是我的去除功能:

bool Handler::removeCompetitor(string name) { 
    bool removed = false; 
    if (find(name) != -1) { 
     Competitor* *temp = new Competitor*[capacity]; 
     int j = 0; 

     for (int i = 0; i < nrOfCompetitors; i++) { 
      if (person[i] != person[find(name)]) { 
       temp[j] = person[i]; 
       j++; 
      } 
     } 
     delete[] person; 

     nrOfCompetitors -= 1; 
     person = temp; 
     removed = true; 
    } 
    return removed; 
} 

這是我的查找功能:

int Handler::find(string name) const { 
    int found = -1; 
    for (int i = 0; i < nrOfCompetitors; i++) { 
     if (person[i]->getName() == name) { 
      found = i; 
     } 
    } 
    return found; 
} 

類「競爭對手」i是一個抽象的基類。 爲什麼最終導致內存泄漏?

+1

你已經過分複雜了。您可以通過保留現有陣列,找到要移除的人員的位置以及將人員移出陣列中的一個插槽後移動所有人來節省大量工作量。 – user4581301

+0

由於它看起來像您正在存儲指向競爭者的指針,您可能需要刪除已刪除的人員以及舊數組。 – user4581301

回答

1

通過創建一個不包含Competitor*的新陣列從陣列中刪除Competitor*後,您很可能需要deleteCompetitor *

delete[] person;前添加delete person[find(name)];

如果你真的想偷偷摸摸,在最頂端found = find(name);和反覆使用found不是重新尋找名字。

+0

謝謝!這工作,但你是對的。我過於複雜了。代碼現在更短,沒有泄漏。 – Henke