2012-07-09 2 views
2

기존 코드베이스에 대해 Valgrind를 실행하면 "일치하지 않는 자유/삭제/삭제 []"오류가 많이 발생합니다. 그들 중 다수는 하나의 문제를 반복하고있다 : 그것은 라인 XXX에서 delete 오퍼레이션이 사용되는 반면, 라인 YYY에서는 malloc 오퍼레이션이 사용된다고 주장한다. 그러나 내가 불평하고 표시된 줄 번호로 이동하는 파일을 열면 메모리가 malloc이 아니라 new으로 할당되지 않은 것으로 나타났습니다. 할당 된 개체는 표준 ifstream이고 new[]도 아니고 delete[]도 사용되지 않습니다.Valgrind가 new를 사용할 때 malloc을 사용한다고 주장합니다.

저는 Valgrind 3.5를 사용하고 있습니다. 아무도 무슨 일이 일어나고 있는지 전혀 모른다. 이것이 실제 오류가 될 수있는 방법을 알 수는 없지만 Valgrind가 많은 오탐을 일으키지 않는다고 주장하는 사람들을 보았 기 때문에 이것을 억압하기 전에 가짜라는 확신을 갖고 싶습니다.

+0

난이 중복 질문이 아닌 희망 : 다음 샘플 프로그램은 같은 오류 메시지가보고있는을 생산하고 있습니다. 나는 Valgrind 질문의 좋은 숫자를 검색하고 만족스러운 답변을 찾지 못했습니다. 그건 그렇고, 코드를 게시 할 수 없습니다. –

+4

@Karzak - 전체 실제 코드를 게시 할 수 없지만 문제를 재현하는 작고 완전한 예제를 만드는 것을 방해하는 것은 없습니다. – Flexo

+1

FWIW 필자는 valgrind가 전에 free/delete/delete []와의 불일치에 대해 잘못 본 적이 없습니다. – Flexo

답변

2

예제 프로그램을 제공하지 않으므로 크리스탈 볼을 추측합니다.

프로그램이 operator new을 제공하지만 operator delete이 누락되었습니다.

#include <new> 
#include <cstdlib> 

/* 
* Sample program that provides `operator new`, but not `operator delete`. 
*/ 

// minimal version of new for demonstration purpose only 
void* operator new(size_t numBytes) { 
    return malloc(numBytes); 
} 

int main() { 
    int *p = new int; 
    delete p; 
} 
+0

'delete'와'operator delete (...)'사이에 차이점이 있습니까? 엄밀히 말하자면, Valgrind는 제게 두 번째 오류에 대한 오류를주고 있습니다. –

+0

예, 있습니다 만,이 토론에서는 구별되지 않습니다. 내 프로그램을 실행하십시오 - 프로그램과 동일한 오류 메시지가 나오면 실마리가 있습니다. 당신의 프로그램에 소스를 읽어서,'operator delete' 정의와 일치하지 않는'operator new'의 정의를 확인하십시오. –

관련 문제