이중 포인터 2
이중 포인터 2
이중 포인터는 생성 패턴으로 많이 사용되곤 한다.
잘못된 예시
value가 obj와 같이 null 값을 가지고 Create 함수가 실행되면서 힙 공간의 주소를 할당 받아 그 공간에 10이라는 값을 저장하게 됨.
Create 함수가 종료되면 콜 되었던 스택이 소멸되고, obj는 값의 변화가 없어 null 값을 가진 채로 printf를 만나 에러가 발생하게 된다.
#include <stdio.h>
void Create(int* value) //int* value = obj(nullptr)
{
value = new int();
*value = 10; //value = 10
} //스택 소멸
int main()
{
int* obj = nullptr; //obj = nullptr
Create(obj);
printf("*obj = %d\n", *obj); //10 안 나오고 에러남 obj = nullptr
delete obj;
return 0;
}
해결 예시
위의 문제는 이중포인터로 해결할 수 있다.
아까처럼 **value에 obj의 값인 nullptr을 받아오는 것이 아닌, obj 자체의 주소 (&obj) 를 받아온다.
그렇게 되면, value에는 obj의 주소 값이, obj에는 새로 생성된 힙 공간의 주소 값이 들어가게 된다.
따라서 Create 함수의 콜 스택이 소멸되어도 value에서 obj의 주소를 가리키던 것이 끊어질 뿐, obj가 가리키던 힙의 공간이 사라지는 것은 아니기에 10이라는 값이 남아있게 된다.
void Create(int** value) //int** value = &obj
{
*value = new int();
//힙 공간 생성 *value == obj = 힙 공간의 주소 전달
**value = 10; //힙 공간의 주소에 접근해 10 저장
} //스택 소멸
int main()
{
int* obj = nullptr; //obj = nullptr
Create(&obj);
printf("*obj = %d\n", *obj);//10
delete obj;
obj = nullptr;
return 0;
}