2016-06-11 2 views
-6

내 클래스 중 하나 (소위 Distribution)의 소멸자가 double free or corruption 오류를 던지고 있습니다. 나는 역 추적을 수행 할 때,이 얻을 다음 Distribution 소멸자 완료하고이 벡터에 소멸자를 호출 할 때 벡터에 의한 이중 자유 또는 손상

#7 0x0000000000409212 in std::vector<double, std::allocator<double> >::~vector (
this=0x7fffffff8f70) 
at /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_vector.h:351 
#8 0x00000000004032c5 in Distribution::~Distribution (this=0x7fffffff8f28) 
at Distribution.cpp:165 

그래서 오류가 발생합니다. 그것은 단순한 벡터로 포인터 나 다른 것이 아니라 double을 포함합니다. ~vector이 (가)이 오류의 원인 일 수 있습니까?

ETA : 간단한 코드 예제를 유용하게 제공 할 수 있는지 모르겠습니다. 내 코드의 여러 위치에서 모든 것이 많이 발생하고 어떤 부분이 관련이 있는지에 대해 잘 알지 못합니다. 의견은 메모리 손상 문제를 암시하므로이를 찾을 수 있습니다.

+1

소멸자에서 프로그램이 작동하지 않는다고해서 버그가있는 곳을 의미하지는 않습니다. C++에 오신 것을 환영합니다. [mcve]를 게시해야합니다. –

+1

벡터의 소멸자가 문제의 원인이 아니므로 코드의 다른 부분이 있습니다. 불행히도 많은 정보를 제공하지 않았습니다. –

+1

종종 메모리 문제가 나중에 나타날 때까지 표시되지 않습니다. 너가 무언가를 타락시키는 것을 처리하면 너는 기억을 풀어 놓을까지 너는 모를지도 모른다. –

답변

3

대표적인 MCVE가 없으면 특정 답변을 제공하는 것이 사실상 불가능합니다.

일반적으로 가장 가능성있는 설명은 성가신 등의 정의되지 않은 동작이 호출 된 다른 코드 (개체에 대한 생성자와 소멸자 호출 사이에서 호출되었지만 개체가 생성되기 전 일 수 있음)가 가장 가능성있는 설명입니다. 포인터.

효과는 매우 간접적 일 수 있습니다. 잘못된 작동이 발생하면 즉시 충돌이 발생한다는 보장은 없습니다. 실제로 증상이 보이지 않으면 오류가 발생하여 관련없는 코드에서 동작이 미묘하게 변경되며 결과적으로 운영 체제에서 감지 할 수있는 더 큰 오작동이 발생합니다. 그런 다음 프로그램이 종료됩니다 .

경우에 따라 이러한 연쇄 이벤트 중 일부는 벡터 할당 자의 작동을 망칠 수 있습니다. 원인이 완전히 무관 한 코드 임에도 불구하고 벡터의 소멸자가 충돌합니다.

+0

그렇다면 벡터를 저장하는 필드가 우연히 덮어 써 져야한다는 뜻입니까? –

+0

그럴 수도 있습니다. 그것은 다른 것을 의미 할 수 있습니다. 잘못된 주소에 쓰는 결과는 정의되지 않았으므로 결과적으로 어떤 일이 발생하는지에 대한 정의 된 제약 조건이 없음을 의미합니다. – Peter

+0

Thanks Peter, 귀하의 의견은 오류를 찾기 위해 알아야 할 사항을 알려주었습니다. 사실 벡터를 저장하고 있던 메모리를 덮어 쓰고있었습니다. –

관련 문제