O problema de travamento causado pelo ponteiro fora dos limites quebrando a estrutura do heap – realloc(): próximo tamanho inválido
O programa C++ de depuração de etapa única encontra um problema que não foi encontrado antes e registra o processo de solução de problemas em detalhes.
declaração de situação
No processo de depuração de etapa única do programa usando Vscode IDE, a primeira situação é que o programa de etapa única não é executado sequencialmente, mas a 乱序执行
segunda 深拷贝时报错
situação é chamar img.
Processo de solução de problemas
1. Problema 1: execução fora de ordem
O motivo é o problema em CMakelists 编译优化选项
, o status de execução fora de ordem, a configuração é a seguinte
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -pthread -fopenmp")
-O3
A otimização da compilação do programa faz com que o programa não execute na ordem normal, mas altera a ordem de execução da instrução com antecedência sem afetar o resultado, o que é inconveniente para a depuração de etapa única, para que possa ser comentada.
2. Problema 2: O copyTo() na função da biblioteca Opencv .clone() falha
estágio um
A princípio pensei que era um uso indevido da função, mas me deparei com uma situação estranha. Minha relação de chamada é a seguinte. Func2 é chamada em func1, e a imagem é copiada profundamente em func2. Em func1... a imagem é não processado.
void func1(cv::Mat& img){
...
func2(img);
}
void func2(cv::Mat & img){
auto res_img = img.clone(); // ***崩溃位置
...
}
Relacionado à consulta opencv api
, também alterei a API copyTo()
para tentar, ainda sem sucesso. Mas no processo, antes que os parâmetros da função func1 sejam passados, não há problema em executar uma cópia profunda da imagem, e aqui está a confusão. O formulário é o seguinte:
auto res_img = img.clone(); // ***没问题
func1(img);
estágio dois
Durante o processo de depuração, a operação ... em func1 foi comentada.Neste momento, verificou-se que a cópia profunda da imagem em func2 estava OK novamente. Nesse momento, percebi que havia um problema em func1 ...操作
, mas... a operação não processava a imagem, então como isso afetaria o cv::Mat?
Veja a operação ... em func1, que é principalmente para a operação de ponteiros. Uma seção de memória é aberta no heap e a memória é lida e gravada por meio de ponteiros. O formulário é o seguinte:
/* func1中的 ... 操作 */
float *p = new float[100];
for(int i=0; i<1000; ++i){ // *** 形式如此,真实不是这么简单,反正指针越界进行了写操作
*(p+i) = 1;
}
Até agora, o problema no título aparece: realloc(): invalid next size
, o motivo final é que a operação do ponteiro em func1 está fora dos limites e alguns campos na memória cv::Mat são modificados, resultando em uma falha.
Resumir
Durante o processo de solução de problemas, há um estado de erro. Se ele existir no programa 指针的操作
, você deve prestar atenção. Tal situação pode ocorrer, e o local onde ocorre o erro não é necessariamente o local onde ocorre o erro real, mas é causado indiretamente pela operação ilegal do ponteiro.