내 코드는 두 개의 클래스가 포함되어 있습니다.*** glibc는 감지 *** ./parent_child_conscall : 더블 무료 또는 손상 (fasttop) : 0x09d9e028는 ***
class points{
char *p;
public: points(){cout<<"constructor points called"<<endl;p=new char();}
virtual ~points(){cout<<"destructor points called"<<endl;delete(p);}
};
class otherpoints: public points{
points x1;
public: otherpoints(){cout<<"constructor otherpoints called"<<endl;x1=points();}
~otherpoints(){cout<<"destructor otherpoints called"<<endl;}
};
int main(int argc, char *argv[])
{
otherpoints y1;
return 0;
}
여기에서는 기본 클래스 생성자에 포인터를 할당하고 해당 기본 클래스 소멸자의 포인터 메모리를 파괴합니다. 내가 바이너리를 사용 Valgrind의를 실행하면
, 그것은 오류가 있습니다 : -
constructor points called
constructor points called
constructor otherpoints called
constructor points called
destructor points called
destructor otherpoints called
destructor points called
==2209== Invalid free()/delete/delete[]
==2209== at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)
==2209== by 0x8048A36: points::~points() (in home/santosh/programs/c++/parent_child_conscall)
==2209== by 0x8048BB2: otherpoints::~otherpoints() (in /home/santosh/programs/c++/parent_child_conscall)
==2209== by 0x804889A: main (in /home/santosh/programs/c++/parent_child_conscall)
==2209== Address 0x42d5098 is 0 bytes inside a block of size 1 free'd
==2209== at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)
==2209== by 0x8048A36: points::~points() (in /home/santosh/programs/c++/parent_child_conscall)
==2209== by 0x8048B32: otherpoints::otherpoints() (in /home/santosh/programs/c++/parent_child_conscall)
==2209== by 0x8048889: main (in /home/santosh/programs/c++/parent_child_conscall)
==2209== destructor points called
==2209==
==2209== HEAP SUMMARY:
==2209== in use at exit: 1 bytes in 1 blocks
==2209== total heap usage: 3 allocs, 3 frees, 3 bytes allocated
==2209==
==2209== LEAK SUMMARY:
==2209== definitely lost: 1 bytes in 1 blocks
==2209== indirectly lost: 0 bytes in 0 blocks
==2209== possibly lost: 0 bytes in 0 blocks
==2209== still reachable: 0 bytes in 0 blocks
==2209== suppressed: 0 bytes in 0 blocks
==2209== Rerun with --leak-check=full to see details of leaked memory
==2209==
==2209== For counts of detected and suppressed errors, rerun with: -v
==2209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 18 from 7)
내가 할당을 취소 할 수없는 생각하는 1 바이트 메모리 알 수 없습니다
.내가 역 추적 보고서를 게시해야합니까?
어떤 도움 감사합니다.
읽기 (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29). –
당신은'points'에게 할당 연산자와 복사 생성자를 줄 필요가 있습니다. * 3의 법칙을 찾는다. – juanchopanza