Problème avec la suppression de la modification

la programmation


J’ai un tableau de CEdit*, si ce tableau contient des éléments qui ne sont pas NULL, je dois les supprimer..J’ai écrit :

<pre>if (m_arEdit.GetSize() > 0)
	{
		for (int j = 0; j < m_arEdit.GetSize(); j++)
			if(m_arEdit[j] != NULL)
			delete m_arEdit[j];  //in this point software crashes because the element is NULL but it results not NULL

	}

mais en débogage, m_arEdit est NULL, la ligne

if(m_arEdit[j] != NULL)

est vrai et le logiciel plante.

Ce que j’ai essayé :

J’ai essayé d’écrire le code comme je l’ai dit mais ce n’est pas correct et je ne sais pas pourquoi

Solution 2

Je suppose que vous appelez ce code plus d’une fois et que la deuxième fois, vous essayez de delete une entrée qui a déjà été supprimée. Vous devriez changer le code en :

C++
for (int j = 0; j < m_arEdit.GetSize(); j++)
{
    if(m_arEdit[j] != NULL)
    {
        delete m_arEdit[j];
        m_arEdit[j] = NULL; // ensure this entry is not tried again
    }
}

Solution 1

Cela fait longtemps que je n’ai pas utilisé MFC… mais votre problème est plus simple que vous ne le pensez : delete est utilisé pour renvoyer de la mémoire au tas, il ne supprimera pas le texte d’un contrôle CEdit.

Et c’est pourquoi votre application plante : la partie de la mémoire que vous essayez de supprimer n’est pas allouée séparément avec new donc le système devient confus et tout s’effondre.

Au lieu de delete utilisez les méthodes CEdit pour supprimer la ligne de texte : Classe CModifier | Microsoft Apprendre[^]

Et en passant, ne supprimez jamais les éléments depuis le début – supprimez toujours depuis la fin et revenez en arrière.
Pourquoi? Deux raisons : premièrement, cela élimine un grand nombre de copies inutiles, et deuxièmement, cela signifie que vous examinez chaque élément. Si vous supprimez depuis le début et que deux éléments côte à côte doivent être supprimés, la suppression du premier et l’incrémentation de l’index signifient que vous ne regardez pas le second.

Je réfléchirais également très sérieusement à ce que vous faites exactement : pourquoi supprimez-vous tous les éléments non vides ? Ne serait-il pas plus judicieux de tout supprimer d’un seul coup, car de toute façon, vous vous retrouverez avec un contrôle “vide” ?

Solution 3

En m’appuyant sur la réponse de Richard, j’apporterais un changement mineur.

C++
int size = m_arEdit.GetSize();
for (int j = size - 1; j >= 0; j--)
{
    if(NULL != m_arEdit[j])
    {
        delete m_arEdit[j];
        m_arEdit[j] = NULL;
    }
}

コメント

タイトルとURLをコピーしました