생성자에서 delete this 문제..
다른 코드를 좀 보다가 위험한 코드이다 싶어 따로 테스트를 해봤는데..
의의로 문제 안 생기는 코드라서 질문 올립니다.
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 하는것이 맞다고 생각하긴 합니다만..글쎄요...
무엇보다....
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
예..그런데 보통 delete 된 공간을...엑세스 하여..변수를 대입한
예..그런데 보통 delete 된 공간을...엑세스 하여..변수를 대입한다거나 하면..access violation 나 user break 정도가 나야 할텐데..그것이 안 나니까 저도 좀 헷갈린다는 겁니다.
그거 테스트 할려고 멤버 변수에다 값 대입하는걸 집어넣었는데 아무런 문제가 없군요. 잠시 컴파일러가 맛이 간건지..아님 오늘 컨디션이 안 좋은건지..모르겠으나..다른 사람도 그러는거 보면 그런것도 아니고 싶고..좀 헷갈리는군요
[quote="snaiper"]예..그런데 보통 delete 된 공간을.
이런 에러가 항상 날 것이라고 장담은 할 수 없죠... -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
댓글 달기