본문 바로가기
VisualStudio.C++.C#/C . C++

C++. 함수 인자로 포인터 전달하고 함수내에서 동적 메모리 할당 받기 2가지 방식. ** *&

by i.got.it 2016. 1. 4.

문제 정의 

 

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


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++ 에서만 가능.

구현요점.

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

CMyClass * p_myclass; 

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

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

 

 

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

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

 
 

 

 

 

 

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5