2016-12-29 79 views
-1

我正在使用类在C++中使用C++空间入侵者游戏的克隆。我希望当激光与外星人(存储在一系列物体中)接触时,包含这个外星人的记忆被释放,并且这个外星人右边的所有记忆被移动1个点,之后我想要创建一个较小的临时数组来存储剩余的对象,以便我可以删除原始内存然后指向临时内存。 (这可能看起来像一个漫长的过程,但它阻止我在整个游戏中检查一个isAlive布尔,并使搜索功能更有效)。如何从对象数组中删除(释放内存)对象(动态内存对象分配)

这是我到目前为止有:

Ennemi::Ennemi() :ExtraTerrestre(0, 0) { 

    maxElements = 1; // int maxElements 
    nbElements = 0; // int nbElements 
    ptr = new Ennemi*[maxElements]; // (Ennemi **ptr) 
} 

int Ennemi::chercherElement(Ennemi element[]){ 

    int indice = 0; 
    while (indice < nbElements && ptr[indice] != element) 
     indice++; 

    // opérateur ternaire, retourne l'indice si vrai, sinon retourne -1 
    return indice < nbElements ? indice : -1; 
} 

void Ennemi::retirerEnnemi(Ennemi element[]) { 
    int indice = chercherElement(element); 

    // si un element est trouver active la condition 
    if (indice != -1) { 
     // preserver l'ordre du tableau 
     for (int i = indice; i < (nbElements - 1); i++) { 
      ptr[i] = ptr[i + 1]; 
     } 
     nbElements--; 
     maxElements = nbElements; 

     // allocation d'une zone memoire 
     double *ptrTemporaire = new double[maxElements]; 

     // copie des elements dans la nouvelle zone 
     for (int i = 0; i < nbElements; i++) { 
      ptrTemporaire[i] = ptr[i]; 
     } 
     // on libere l'ancienne zone memoire 
     delete[] ptr; 

     // fait pointer le pointeur sur la nouvelle zone 
     ptr = ptrTemporaire; 
    } 
} 

附:请不要建议使用矢量,我试图提高我的理解,而不是简单的方法。

+0

我的不好,我的代码有一个错误“double * ptrTemporaire = new double [maxElements];” – Kevin

+1

这不是唯一的错误,你的代码是不可编译的,几乎是一团糟。如果你想使用原始数组,你需要更好地理解该主题。 – Slava

+0

缓冲区是'Ennemi ** ptr'还是'Ennemi元素[]'?你的代码还不清楚。 –

回答

0

我的建议是创建一个链接列表结构,以便您可以轻松地释放内存并移动成员。

0

所有这些功能首先可以正常工作,但它是设计不良:

int Ennemi::chercherElement(Ennemi element[]); 

此功能假设通过指针找到的元素的索引,但你的函数名称为findElement(原谅我的法语)和你传递元素的数组。虽然在语法上是一样的它会混淆读者,包括你自己,所以它应该是:

int Ennemi::findElementIndex(Ennemi *element); 

(或翻译回法国)现在使之完全正确的,我们应该注意到,这种方法不是想改变element也不内部数据,所以

int Ennemi::findElementIndex(const Ennemi *element) const; 

现在你从数组删除数据,你的代码几乎是正确的,但你缺少的代码删除对象本身:

if (indice != -1) { 
     delete ptr[i]; // this missing 
     // preserver l'ordre du tableau 
     for (int i = indice; i < (nbElements - 1); i++) { 
      ptr[i] = ptr[i + 1]; 
     } 
     nbElements--; 
    } 

之后,您试图缩小动态分配的数据,不要这样做。分配/取消分配内存是一项相当昂贵的操作,所以通常在没有足够空间的情况下扩展(并且不应该扩展一个,而应该增加一个三角形),并且不缩回,因为很有可能必须重新恢复再次。或者你可能至少缩小一些三角洲。例如,当元素的量== maxElemens/2

而且这条线:

double *ptrTemporaire = new double[maxElements]; 

您尝试创建双打的阵列,并将其分配给指针数组Ennemi,这肯定是不对的。

+0

非常感谢。是的,我忘记在移动值之前删除所讨论的对象。是的,你的权利,我不需要逐步收缩内存1,只是跟踪外星人数量(并减少搜索限制),然后稍后收缩一些三角洲是更有效率和我确实想过使用*元素(在指定区域的值),但由于某种原因,它没有连接在我的头:(尽管如此,这些概念还是新的,但非常感谢。 – Kevin