es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Desbordamiento de matriz COMDLG_FILTERSPEC de C++ COM.

Tengo esta función que tomará una lista de pares de cadenas y generará una matriz COMDLG_FILTERSPEC. Los pares son así: first = “Todos los tipos” segundo = “*. *”

La función funciona, sin embargo, obtengo sobrecargas de búfer como se muestra aquí:

También obtengo este bonito mensaje que me dice que tendré sobrecargas de búfer.

No tengo idea de cómo solucionar esto o por qué está sobrepasando. ¿Alguien puede ayudar?

Aquí está el código:

COMDLG_FILTERSPEC * CreateFILTERSPEC (std :: list & lt; std :: pair & lt; std :: wstring, std :: wstring & gt; & gt; _filters) {

// TODO: Causa una pérdida de memoria al eliminarla. Solucionarlo.

COMDLG_FILTERSPEC * filterSpecs = new COMDLG_FILTERSPEC [_filters.size ()];

int i = 0;
para (std :: pair & lt; std :: wstring, std :: wstring & gt; filtro: _filtros) {


    PWSTR f1_p = nuevo wchar_t [filter.first.length ()];
    filtro.first.copy (f1_p, filter.first.length ());

    PWSTR f2_p = new wchar_t [filter.second.length ()];
    filter.second.copy (f2_p, filter.second.length ());

    COMDLG_FILTERSPEC fs = {f1_p, f2_p};

    filterSpecs [i] = fs;
    i ++;
}

return filterSpecs;

}

Cualquier ayuda es apreciada, gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Función para crear un arreglo COMDLG_FILTERSPEC

    Se ha creado una función en C++ para tomar una lista de pares de cadenas y generar un arreglo COMDLG_FILTERSPEC. Los pares están en la forma de ‘Todos los tipos’ y ‘.‘. Sin embargo, están ocurriendo sobrescrituras de búfer, lo que está causando una fuga de memoria al eliminar la función.

    Código

    COMDLG_FILTERSPEC * CreateFILTERSPEC(std::list<><std::wstring, std::wstring="">> _filters) {
    
        //TODO: Causa una fuga de memoria al eliminarla. Arreglar.
    
        COMDLG_FILTERSPEC* filterSpecs = new COMDLG_FILTERSPEC[_filters.size()];
    
        int i = 0;
        for (std::pair<std::wstring, std::wstring=""> filter : _filters) {
    
    
            PWSTR f1_p = new wchar_t[filter.first.length()];
            filter.first.copy(f1_p, filter.first.length());
    
            PWSTR f2_p = new wchar_t[filter.second.length()];
            filter.second.copy(f2_p, filter.second.length());
    
            COMDLG_FILTERSPEC fs = { f1_p, f2_p };
    
            filterSpecs[i] = fs;
            i++;
        }
    
        return filterSpecs;
    
    }
    

    Problema de sobrescritura de búfer

    La función está causando una sobrescritura de búfer, lo que es evidente por el mensaje de error mostrado en la captura de pantalla.

    Solución

    Para solucionar el problema de sobrescritura de búfer, se debe definir el tamaño de las matrices de caracteres para f1_p y f2_p, ambas actualmente vacías. Esto puede hacerse agregando +1 después de filter.first.length() y filter.second.length(), para tener en cuenta el terminador nulo al final de una cadena.

    Además, hay una fuga de memoria al eliminar el puntero, que se puede solucionar eliminando explícitamente los punteros antes de volver de la función.

    Aquí está el fragmento de código actualizado:

    COMDLG_FILTERSPEC * CreateFILTERSPEC(std::list<><std::wstring, std::wstring="">> _filters) {
    
        COMDLG_FILTERSPEC* filterSpecs = new COMDLG_FILTERSPEC[_filters.size()];
    
        int i = 0;
        for (std::pair<std::wstring, std::wstring=""> filter : _filters) {
    
            PWSTR f1_p = new wchar_t[filter.first.length() + 1]; // arreglar sobrescritura de búfer
            filter.first.copy(f1_p, filter.first.length() + 1);
    
            PWSTR f2_p = new wchar_t[filter.second.length() + 1]; // arreglar sobrescritura de búfer
            filter.second.copy(f2_p, filter.second.length() + 1);
    
            COMDLG_FILTERSPEC fs = { f1_p, f2_p };
    
            filterSpecs[i] = fs;
            i++;
        }
    
        // eliminar los punteros antes de devolverlos
        for(int j = 0; j < i; j++) {
            delete[] filterSpecs[j].pszName;
            delete[] filterSpecs[j].pszSpec;
        }
    
        return filterSpecs;
    }
    

    Estos cambios aseguran que la función se ejecute sin problemas de sobrescritura de búfer, y que no haya fuga de memoria al eliminar.</std::wstring,></std::wstring,></std::wstring,></std::wstring,>

Comments are closed.