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.

¿Por qué estoy obteniendo una sobrecarga de búfer de montón al usar la función sort de STL en C++?

A continuación se muestra mi función de comparación personalizada:

static bool compare(int x, int y) {
    string _x = to_string(x);
    string _y = to_string(y);
    return _x + _y >= _y + _x;
}

Y estoy programando de esta manera:

vector<int> nums(10000, 0);
sort(nums.begin(), nums.end(), compare);

Al ejecutarlo, obtendré un error:

ERROR: AddressSanitizer: depósito de montón desbordado en dirección en ...

Creo que es mi función de comparación la que causó este problema, pero no sé cómo resolverlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “heap-buffer-overflow” indica que el programa está tratando de acceder a una memoria que está fuera de los límites del búfer asignado. Esto puede ser causado por la función de comparación accediendo a elementos más allá del final del vector nums.

    Para resolver este problema, puede intentar modificar su función de comparación para que solo compare elementos dentro de los límites del vector nums. Una forma de hacer esto es verificar el tamaño de la concatenación de cadenas antes de comparar:

    static bool compare(int x, int y) {
            string _x = to_string(x);
            string _y = to_string(y);
            string xy = _x + _y;
            string yx = _y + _x;
            return xy.size() == yx.size() ? xy >= yx : xy.size() > yx.size();
    }
    

    Esta función de comparación modificada primero concatena las cadenas y las almacena en las variables xy y yx. Luego verifica si los tamaños de xy e yx son iguales. Si son iguales, compara los valores de las cadenas normalmente. Si no son iguales, devuelve el resultado de la comparación basado en la longitud de las cadenas concatenadas.

    Al hacer esto, puede asegurarse de que el algoritmo solo compare elementos dentro de los límites del vector nums asignado, evitando así el error de desbordamiento del búfer del montón.

Comments are closed.