문제 정의.

 

통상적인 동적 메모리 할당은 아래와 같다.

 

CMyClass * p_myclass = new CMyClass();


그런데, 위와 달리 포인터변수 선언만 하고, 동적할당은 별도의 함수에서 하고 싶다고 하자. 
즉, 아래 코드구조처럼 함수 function의 인자로 p_myclass 를 전달하여 function  p_myclass 를 동적할당 받고 싶다.

CMyClass * p_myclass;  // 포인터변수 p_myclass 선언만 했다.


function(p_myclass); // 이 함수호출하고 나면 p_myclass 동적할당 되게 하려함.  


 

흔히 하게 되는 틀린 코드 사례. 

CMyClass * p_myclass;


function(p_myclass);


function(CMyClass * p_myclass)

{

 p_myclass = new CMyClass();


 

아래 방법으로 해야 함. 2가지 방식.

 


 

 

방식1. 함수 인자 타입 ** . C와 C++ 모두 가능.

 
 

 

CMyClass * p_myclass;

function(&p_myclass);                       // 호출시 인자로 &p_myclass로 함. 이때의 &는 번지 연산자임.

function(CMyClass** pp_myclass)     // **
{
    *pp_myclass = new CMyClass();   // *pp_myclass 로 했음에 주의.
}


구현요점.
함수 입력할 인자형을 포인터의 포인터로 선언하고, 함수 호출시 인자에  번지 연산자 인가하여 전달함.
 


 

 

방식2.함수 인자 타입*&. C++ 에서만 가능.

 

 

CMyClass * p_myclass; 

function(p_myclass);                      // 호출시 인자로포인터변수명 그대로 입력하면됨.

function(CMyClass*& rp_myclass)  // <- 이것 &는 자료형에 부가되어 참조(Reference) 변수를 의미하는 것. 번지연산자 아님.
{
    rp_myclass = new CMyClass(); // 인자로 전달받은 변수명 rp_myclass 그대로 사용함.
}


구현요점.
함수 인자 타입에 & 를 부가하여 인자 rp_myclass는  "포인터변수의 참조타입"이라는 의미로 정의함. 이때의 &는  번지연산자아님.
함수 내부에서 함수인자의 변수명을 그대로 사용하여 동적 할당 시키면 됨.  
 



상기 구현-1,2  모두 결과적으로 동일한  것이며, 정상작동한다. .

본 글에서는 예로써 class 인 경우만을 보였으나, 구조체든, malloc이든  동일한 방식으로 구현하면됨.


 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 

 ///533.




Posted by 리치굿맨

댓글을 달아 주세요