O problema de travamento causado pelo ponteiro fora dos limites, quebrando a estrutura da pilha -- realloc(): próximo tamanho inválido

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")

-O3A 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.

Acho que você gosta

Origin blog.csdn.net/weixin_36354875/article/details/127313543
Recomendado
Clasificación