쓰레드내에서 객체 삭제 문제 질문드립니다.
글쓴이: FruitsCandy / 작성시간: 금, 2004/05/21 - 3:20오후
joinc의 강좌중 일부 수정하다가 궁금한 것이 생겼습니다.
아래 코드는 " tClass라는 클래스에서 쓰레드를 만드는 코드" 입니다.
그런데 callThread(쓰레드 함수)에서 객체를 삭제하면 '세크먼트 오류'가 납니다. callThread 함수가 객체에 종속된 것도 아닌데 어찌하여 이러한 현상이
나타나는지 모르겠습니다.
아시는 분은 답변좀 부탁드립니다.
#include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <iostream> using namespace std; static void* callThread(void* arg); // 실제 pthread_create에 사용되는 메소드 class tClass { public : pthread_t pt; int* a; void tFunc(void) { } tClass(void) { cout << "This is constructor" << endl; a = new int; *a = 1; pthread_create(&pt, NULL, callThread, this); } ~tClass(void) { int i; // 인스턴스들의 메모리해제를 알아보기 위하여 루프를 돌림 for (i = 0; i < 3; i++) { cout << "This is destructor" << endl; sleep(1); } delete a; ////////////////////////여기서 딱 뻗어버립니다. } }; void* callThread(void* arg) { tClass* tp; tp = (tClass*) arg; int temp = 0; while(1) { cout << "This is thread method " << temp << endl; sleep(1); if(temp ==3) { //////////////////// 객체 삭제하고 소멸자로 가면... cout<<"메모리 해제 전 "<<endl; delete tp; cout<<"메모리 해제 후 "<<endl; return NULL; } temp++; } } int main() { int i; tClass tc; for (i = 0; i < 50 ; i++) { cout <<"This is main : "<<i<< endl; sleep(1); } cout << "main exit" << endl; return (1); }
Forums:
tp가 new로 할당된 tClass인가요...?delete tp;
tp가 new로 할당된 tClass인가요...?
delete tp; 하면 안될 것 같습니다만...
스택의 영역을 delete로 삭제해서 세그먼트 폴트가 난 것이었습니다.
스택의 영역을 delete로 삭제해서 세그먼트 폴트가 난 것이었습니다.
참으로 쪽팔리는군요 ㅋㅋ
맹고이님. 답변 감사합니다.
아래는 이것과 관련해서 아까 테스트 해본 내용인데 결과가 참 이상합니다.
레뎃9 gcc 3.2.2입니다.
리눅스에서 위 코드를 실행하면
AAA con
~AAA des <-- 이렇게 나오고 행이 걸려버립니다. 쉘도 안떨어지고요.
윈도우에서 VC++로 실행하면 오류메세지 보여줍니다. 오류메세지가 떠주어야 정상이겠지요.
크... 다른 버전의 gcc도 나중에 한번 해봐야겠습니다.
아지랑이류 초환상 공콤 화랑... 포기하다.. T.T
오류메시지가 뜨는게 더 이상하군요.어떤 오류메시지를 말씀하시는지.(런
오류메시지가 뜨는게 더 이상하군요.
어떤 오류메시지를 말씀하시는지.(런타임 에러 오류 말씀이신가요? )
컴파일러는 pA1이 가르키는 값을 알지 못합니다. 그래서 런타임에 소멸자 호출하고 스택에 있는 값을 delete하려다가 세그멘테이션 폴트가 걸리는게 맞겠죠. (행이 걸린다면, 음. 왜 일까요. 여하튼 비정상적인 상황일테니까요.)
어쨌건 간에, 뭐가 어떻게 되도 이상하지 않은 상황인걸로 보이는군요.
sparc SunOS gcc 3.3 으로 돌린결과 끝까지 실행 -
sparc SunOS gcc 3.3 으로 돌린결과
끝까지 실행 - 워닝 없음 세그폴트... 등 없음
VC++ Debug Mode
Assetion failed 로 프로그램 중단
VC++ Release Mode
끝까지 실행 - 워닝없음 , 런타임에러 없음
무슨 차이일까요?
윗분 말씀처럼 코드자체에 문제가 있어보이긴 하는데
정상적으로 실행되는 경우가 있으니 이 또한 이상하군요
[code:1]오류메시지가 뜨는게 더 이상하군요. 어떤 오류메시지를
런타임에 발생하는 메세입니다.
크.. 솔라에서는 세그폴트도 안나다니.. 신기하네요.
여튼 문법적으로 틀린 코드이지만 다양한 상황이 나오니 궁금해집니다.
테스트 감사드립니다. ^^
아지랑이류 초환상 공콤 화랑... 포기하다.. T.T
보통 책에 보면 이런 행동의 결과는 정의 되어 있지 않다고 하지 않나요?
보통 책에 보면 이런 행동의 결과는 정의 되어 있지 않다고 하지 않나요?
그러니 어떻게 될지는 컴파일러마다 다를 수도 있겠죠 뭐... :roll:
댓글 달기