생성자에서 delete this 문제..

snaiper의 이미지

다른 코드를 좀 보다가 위험한 코드이다 싶어 따로 테스트를 해봤는데..
의의로 문제 안 생기는 코드라서 질문 올립니다.

class A
{
public:
A()
{
delete this;
}

void test()
{
a=1;
}

private:
int a;
};

void main()
{
A* pa=new A;

pa->test();

}

아주 간단하게 테스트를 해봤는데..불행히도(?) 에러가 안나는군요.
각각 vc6, vc 2003(아 프로그램 끝날 시점에서 user break가 뜨네요), gcc 3.X 에서 테스트해봤으나 access violation
내지는 세그먼트 폴트가 나질 않는군요.

물론 소멸자를 따로 지정해주거나...new 를 for 문으로 해서 돌린다거나..
또는 new로 해주지 않고 그냉 A a;로 한다면(이건 당연하겠죠?)
vc에서 user break 에러를 냅니다.

그런데 위에선 에러 없이 잘 되는걸 볼 수 있는데
이거 무슨 이유로 그런걸까요?

좀 더 복잡한 코드에서 에러 나는걸로 보아 나름대로 정의되지 않은 동작이라서
우연히 에러를 안 내는게 아닐까 싶은데... 다른 분 생각은 어떠신지요?
꽤나 C++ 공부했다고 생각했는데..이건 왜 그런지 잘 모르겠군요.

ps. 아 원래 코드는 다른 사람이 짠거 보다 나왔는데...생성자에서 다른 클래스를 new 하여 생성하는데. 여기서 널을 리턴하면 delete this; 하고 리턴하도록 되어 있습니다.그래서 문제 있는 코드라고 생각하고(물론 널 리턴하는 일이 얼마나 많겠냐만 말이죠) 잠시 테스트 해봤는데..이거 결과는
무지 헷갈리는 상황이군요 ... 만약 이런 상황일 경우..예외를 throw 하는것이 맞다고 생각하긴 합니다만..글쎄요...

ihavnoid의 이미지

class A 
{ 
public: 
    A() 
    { 
        delete this; 
    } 

    void test() 
    { 
        a=1; 
    } 

private: 
    int a; 
}; 



void main() 
{ 
    A* pa=new A; 

    pa->test(); 

} 

new A 를 하는 순간, delete까지 되는데, pa->test()를 호출하는 게 되나요?
이미 free된 공간의 메모리를 access하는 효과가 나게 되지 않을까 생각이 됩니다. (그냥 추정입니다.)

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

snaiper의 이미지

예..그런데 보통 delete 된 공간을...엑세스 하여..변수를 대입한다거나 하면..access violation 나 user break 정도가 나야 할텐데..그것이 안 나니까 저도 좀 헷갈린다는 겁니다.
그거 테스트 할려고 멤버 변수에다 값 대입하는걸 집어넣었는데 아무런 문제가 없군요. 잠시 컴파일러가 맛이 간건지..아님 오늘 컨디션이 안 좋은건지..모르겠으나..다른 사람도 그러는거 보면 그런것도 아니고 싶고..좀 헷갈리는군요

ihavnoid의 이미지

snaiper wrote:
예..그런데 보통 delete 된 공간을...엑세스 하여..변수를 대입한다거나 하면..access violation 나 user break 정도가 나야 할텐데..그것이 안 나니까 저도 좀 헷갈린다는 겁니다.
그거 테스트 할려고 멤버 변수에다 값 대입하는걸 집어넣었는데 아무런 문제가 없군요. 잠시 컴파일러가 맛이 간건지..아님 오늘 컨디션이 안 좋은건지..모르겠으나..다른 사람도 그러는거 보면 그런것도 아니고 싶고..좀 헷갈리는군요

이런 에러가 항상 날 것이라고 장담은 할 수 없죠... -0-
(오히려 안 나는 게 더 무섭습니다-_- 에러라도 나면 버그라도 잡지)

이 경우에는 안 나는 게 맞을 듯 합니다.
어차피 deallocation을 했다고 해도 heap 영역에 있을테고, 쓰기를 해서 dynamic allocation을 위한 자료구조가 망가지더라도(망가질 수도 있고 안 망가질 수도 있고) 프로그램이 종료되기 전에 new나 delete을 또 하지 않으니깐요.

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.