문제 정의
통상적인 동적 메모리 할당은 아래와 같다.
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이든 동일한 방식으로 구현하면됨.
상위정리
Visual Studio/VC++/C/C# 활용정리
첫 등록 : 2016.01.04
최종 수정 : 2022.04.06
단축 주소 : https://igotit.tistory.com/533
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
C/C++ 실수형 float, double 표준 IEEE754. 실수자료형 사용시 주의사항. (0) | 2016.02.18 |
---|---|
C++ std::thread 클래스 이용한 스레드. 클래스멤버함수를 스레드로 실행시키는 방법. (0) | 2016.01.16 |
C++. 파생 클래스에서 베이스 클래스의 인자 있는 생성자 실행되게 처리법 (1) | 2015.12.28 |
C++. 클래스 생성자 관련 기초 지식. - 디폴트 생성자/복사생성자/디폴트복사생성자/Shallow Copy/Deep Copy 등. (0) | 2015.12.28 |
2차원 이상 배열의 메모리 배치순서. (0) | 2015.01.17 |
댓글