El problema de bloqueo causado por el puntero fuera de los límites que rompe la estructura del montón: realloc (): tamaño siguiente no válido

El problema de bloqueo causado por el puntero fuera de los límites rompiendo la estructura del montón – realloc (): tamaño siguiente no válido

El programa C++ de depuración de un solo paso encuentra un problema que no se ha encontrado antes y registra el proceso de solución de problemas en detalle.

Declaración de situación

En el proceso de depuración de un solo paso del programa que usa Vscode IDE, la primera situación es que el programa de un solo paso no se ejecuta secuencialmente, pero la 乱序执行segunda 深拷贝时报错situación es llamar a img.

Proceso de solución de problemas

1. Problema 1: ejecución desordenada

El motivo es el problema en CMakelists 编译优化选项, el estado de ejecución fuera de orden, la configuración es la siguiente

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3  -pthread -fopenmp")

-O3La optimización de compilación del programa hace que el programa no se ejecute en el orden normal, sino que cambia el orden de ejecución de las instrucciones por adelantado sin afectar el resultado, lo que es un inconveniente para la depuración de un solo paso, por lo que se puede comentar.

2. Problema 2: el copyTo() en la función de biblioteca Opencv .clone() falla

la etapa uno

Al principio pensé que era un uso inadecuado de la función, pero me encontré con una situación extraña. Mi relación de llamada es la siguiente. Se llama a Func2 en func1, y la imagen se copia en profundidad en func2. En func1... la imagen es no procesado.

void func1(cv::Mat& img){
    ...
    func2(img);
    }
 
void func2(cv::Mat & img){
    auto res_img = img.clone(); // ***崩溃位置
    ...
    }

Relacionado con la consulta opencv api, también cambió la API copyTo()para probar, aún sin éxito. Pero en el proceso, antes de pasar los parámetros de la función func1, no hay problema en realizar una copia profunda de la imagen, y aquí está la confusión. El formulario es el siguiente:

 auto res_img = img.clone(); // ***没问题
 func1(img);

etapa dos

Durante el proceso de depuración, se comentó la operación ... en func1. En este momento, se encontró que la copia profunda de la imagen en func2 estaba bien nuevamente. En ese momento me di cuenta que había un problema en func1 ...操作, pero... la operación no procesaba la imagen, entonces ¿cómo afectaría a cv::Mat?
Vea la operación ... en func1, que es principalmente para la operación de punteros. Se abre una sección de memoria en el montón, y la memoria se lee y escribe a través de punteros. La forma es la siguiente:

/* func1中的 ... 操作 */
float *p = new float[100];
for(int i=0; i<1000; ++i){ // *** 形式如此,真实不是这么简单,反正指针越界进行了写操作
   *(p+i) = 1;  
}

Hasta ahora, el problema en el título aparece: realloc(): invalid next size, la razón final es que la operación del puntero en func1 está fuera de los límites, y algunos campos en la memoria cv::Mat se modifican, lo que resulta en un bloqueo.

Resumir

Durante el proceso de solución de problemas, hay un estado de error. Si existe en el programa 指针的操作, debe prestar atención. Tal situación puede ocurrir, y el lugar donde ocurre el error no es necesariamente el lugar donde ocurre el error real, sino que es causado indirectamente por la operación ilegal del puntero.

おすすめ

転載: blog.csdn.net/weixin_36354875/article/details/127313543