Problema al eliminar la edición

programación


Tengo una matriz de CEdit*, si esta matriz tiene elementos que no son NULL, tengo que eliminarlos… Escribí:

C++
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

	}

pero cuando en depuración m_arEdit es NULL la fila if(m_arEdit[j] != NULL)

es cierto y el software falla..

Lo que he probado:

Intenté escribir el código como dije pero no es correcto y no sé por qué.

Solución 2

Supongo que está llamando a este código más de una vez y la segunda vez que intenta delete una entrada que ya ha sido eliminada. Deberías cambiar el código a:

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
    }
}

Solución 1

Ha pasado mucho tiempo desde que uso MFC… pero tu problema es más simple de lo que crees: delete se usa para devolver la memoria al montón, no eliminará el texto de un control CEdit.

Y es por eso que tu aplicación falla: la porción de memoria que intentas eliminar no está asignada por separado con new Entonces el sistema se confunde y todo se estropea.

En lugar de delete utilice los métodos CEdit para eliminar la línea de texto: Clase CEdit | Microsoft aprende[^]

Y como comentario aparte, nunca elimine elementos desde el principio; elimine siempre desde el final y vuelva a trabajar.
¿Por qué? Dos razones: en primer lugar, elimina una gran cantidad de copias innecesarias y, en segundo lugar, significa que usted mira cada elemento. Si elimina desde el principio y es necesario eliminar dos elementos uno al lado del otro, eliminar el primero e incrementar el índice significa que no mira el segundo.

También pensaría bastante en qué estás haciendo exactamente: ¿por qué estás eliminando todos los elementos que no están vacíos? ¿No sería más sensato eliminar todo de una sola vez ya que terminará con un control “vacío” de cualquier manera?

Solución 3

Basándonos en la respuesta de Richard, haría un cambio menor.

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をコピーしました