class 소멸자가 계속 호출됨..무한루프
이상한 증상은 프로그램 종료시 class 소멸자가 계속 호출 됩니다.
아래와 같이 printf 해 보면.. 콘솔에 ~CTest가 무쟈게 찍히다가 세그먼트 폴트
가 발생합니다. --;
CTest::~CTest()
{
printf("~CTest\n");
}
나름대로 이유를 판단해 보면 class와 thread를 같이 사용하는데서
문제가 발생하지 않았나 생각합니다. 아래와 같이 하는데 혹 문제가 있을수
있는지 한번 판단해 주세요.
1. class 를 생성하고, 초기화 시에 thread를 생성했습니다.
2. class 생성되고, thread가 생성되었고
3. thread에서 class 함수 Work를 호출합니다.
4. Work 함수는 class 내의 맴버변수등을 사용합니다.
간략한 예를 들면
// 쓰레드 함수
void* thread_func(void* arg)
{
CTest* pObject = (CTest*)arg;
pObject->Work();
return 0;
}
// 생성자
CTest::CTest()
{
}
// 소멸자
CTest::~CTest()
{
}
// 초기화 함수
CTest::Init()
{
// thread 생성
}
// 스레드에서 호출하는 함수
CTest::Work()
{
:
// CTest의 맴버 변수를 사용하기 위해서 이렇게 했습니다.
}
위와 같은 형태로 되어 있습니다.
제 생각에 thread에서 class 함수를 호출하는 식으로 사용하는것이
문제가 되는 가? 하는 것입니다.
ms원도우 계열에서는 이런씩으로 사용했었는데..
이런 경험이 있으신 분 계신가요?
후움 정확한 답변을 드리긴 힘들것같습니다제가보기엔.. 처리 방식상
후움 정확한 답변을 드리긴 힘들것같습니다
제가보기엔.. 처리 방식상의 문제일것 같습니다만..
단시 소멸자가 계속 호출된다면 delete를 누가 계속 콜하고 있다는것
입니다.. 소멸자에 this포인터의 주소값을 찍어보시고
항상 같은 주소값이 찍힌다면 일단 해당 오브젝트가 한번
소멸된후에도 계속 콜된다는것일겁니다..
사용후 delete된 Object를 다시 delete 하는 부분을 수정하셔야
하지 않을까요? Object List를 가지고 사용하신다면 리스트에서
빠지지 않아서 delete후에도 해당 Pointer로 콜을 시도하고있다던가
아니면.. 여러 쓰레드가 한오브젝트로 동시에 접근을 해버린다던가..
그래서 한쓰레드가 delete를 한후에도 사용하려했다던가의
문제가 아닐까 의심이 되는군요.. 참고하시길 바랍니다..
' 형식이 내용을 규정한다. '
댓글 달기