쓰레드내에서 객체 삭제 문제 질문드립니다.

FruitsCandy의 이미지

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);
}
맹고이의 이미지

tp가 new로 할당된 tClass인가요...?

delete tp; 하면 안될 것 같습니다만...

FruitsCandy의 이미지

스택의 영역을 delete로 삭제해서 세그먼트 폴트가 난 것이었습니다.
참으로 쪽팔리는군요 ㅋㅋ
맹고이님. 답변 감사합니다.

아래는 이것과 관련해서 아까 테스트 해본 내용인데 결과가 참 이상합니다.

레뎃9 gcc 3.2.2입니다.

#include <iostream>

using namespace std;
  
class AAA{
public:
	AAA()
	{
		cout<<"AAA con"<<endl;
	}
	~AAA()
	{
		cout<<"~AAA des"<<endl;
	}
	AAA* ReturnPoint()
	{
		return this;
	}
};
 
int main()
{
	AAA A1;
	AAA * pA1 = A1.ReturnPoint();

	delete pA1;

	cout<<"EXIT"<<endl;
	return 0;
}

리눅스에서 위 코드를 실행하면

AAA con
~AAA des <-- 이렇게 나오고 행이 걸려버립니다. 쉘도 안떨어지고요.

윈도우에서 VC++로 실행하면 오류메세지 보여줍니다. 오류메세지가 떠주어야 정상이겠지요.

크... 다른 버전의 gcc도 나중에 한번 해봐야겠습니다.

아지랑이류 초환상 공콤 화랑... 포기하다.. T.T

dyks의 이미지

오류메시지가 뜨는게 더 이상하군요.
어떤 오류메시지를 말씀하시는지.(런타임 에러 오류 말씀이신가요? )

컴파일러는 pA1이 가르키는 값을 알지 못합니다. 그래서 런타임에 소멸자 호출하고 스택에 있는 값을 delete하려다가 세그멘테이션 폴트가 걸리는게 맞겠죠. (행이 걸린다면, 음. 왜 일까요. 여하튼 비정상적인 상황일테니까요.)

어쨌건 간에, 뭐가 어떻게 되도 이상하지 않은 상황인걸로 보이는군요.

nachnine의 이미지

sparc SunOS gcc 3.3 으로 돌린결과
끝까지 실행 - 워닝 없음 세그폴트... 등 없음

VC++ Debug Mode
Assetion failed 로 프로그램 중단

VC++ Release Mode
끝까지 실행 - 워닝없음 , 런타임에러 없음

무슨 차이일까요?

윗분 말씀처럼 코드자체에 문제가 있어보이긴 하는데
정상적으로 실행되는 경우가 있으니 이 또한 이상하군요

FruitsCandy의 이미지

오류메시지가 뜨는게 더 이상하군요. 
어떤 오류메시지를 말씀하시는지.(런타임 에러 오류 말씀이신가요? ) 

런타임에 발생하는 메세입니다.

Quote:
sparc SunOS gcc 3.3 으로 돌린결과
끝까지 실행 - 워닝 없음 세그폴트... 등 없음

VC++ Debug Mode
Assetion failed 로 프로그램 중단

VC++ Release Mode
끝까지 실행 - 워닝없음 , 런타임에러 없음

크.. 솔라에서는 세그폴트도 안나다니.. 신기하네요.

여튼 문법적으로 틀린 코드이지만 다양한 상황이 나오니 궁금해집니다.

테스트 감사드립니다. ^^

아지랑이류 초환상 공콤 화랑... 포기하다.. T.T

맹고이의 이미지

보통 책에 보면 이런 행동의 결과는 정의 되어 있지 않다고 하지 않나요?

그러니 어떻게 될지는 컴파일러마다 다를 수도 있겠죠 뭐... :roll:

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.