|
- 질문 1. delete b_node; => 이렇게 하면 str_b만 삭제가되고 str_a는 남아 있는지요?
b_node에 할당된 메모리를 해제한다는 것입니다. 여기서 b_node는 단지 str_b형의 주소(포인터)의 저장공간만을 말합니다. win32s시스템에서는 4byte 변수일 뿐입니다. 이 예에서는 b_node는 mynode라는 이름의 str_a형의 주소를 가지고있는 메모리의 주소입니다. 주의하실게 str_b와 str_a는 형태일뿐이라는 것입니다. int나 float처럼 말이지요. 찬찬히 따져서 생각해 보시기 바랍니다.
- 질문 2. delete b_node->mynode; => 이렇게 하면 str_a가 삭제가 되는지요?
이 예에서는 b_node->mynode는 a_node를 가리키고 있으므로 a_node의 할당이 해제되는 것입니다. str_a는 형일뿐이라는 말씀을 다시 드리고요,.. 질문의도를 짐작해보아.. a_node->a와 a_node->b는 해제됩니다. 그러나 주의할 것은 할당된 메모리는 해제되지만, 값은 그대로 있다는 것입니다. 실질적으로 b_node->mynode를 삭제하면 NULL을 대입하는 것이 안전합니다. 값은 유지되기 때문에 나중에 프로그래머가 잊어버리고 다시 엑세스하면 a_node가 할당된 주소를 알려줍니다(경우에 따라서는 쓰레기값으로 변했을수도 있습니다.). 안전하지 않은 엑세스가 가능한 것이죠.
- 질문 3. delete한후 a_node와 b_node에 접근하려 하면 에러가 발생하여야 하는거 아닌가요?
위에서 같이 말씀드렸듯이 delete만 한다고 해서 저장되었던 값이 사라지는 것은 아닙니다. 의도적으로 NULL을 대입하셔야 합니다. 안전 해제라고 부르는 방식입니다.
예) delete b_node; b_node=NULL;
금영이 님이 쓰신 글 :
: typedef struct {
: int a;
: int b;
: } str_a;
:
: typedef struct {
: str_a *mynode;
: int c;
: } str_b;
:
:
: str_a *a_node;
: str_b *b_node;
:
: a_node = new str_a;
: b_node = new str_b;
:
: a_node->a = 1;
: a_node->b = 2;
:
: b_node->mynode = a_node;
:
: 질문 1. delete b_node; => 이렇게 하면 str_b만 삭제가되고 str_a는 남아 있는지요?
: 질문 2. delete b_node->mynode; => 이렇게 하면 str_a가 삭제가 되는지요?
: 질문 3. delete한후 a_node와 b_node에 접근하려 하면 에러가 발생하여야 하는거 아닌가요?
|