본문 바로가기
반응형

pointer9

유니티 C# Dictionary와 delegate를 이용한 함수 포인터 Unity 전체 링크 C, C++에서의 함수 포인터를 C#에서는 delegate를 이용한다. 심플 이벤트 핸들러에서 event 변경에 따라 함수를 실행하고 싶다고 하자. 함수 포인터를 사용하지 않는다면 CURRENT_EVENT를 if/else로 매번 처리해서 이벤트를 실행해야 한다. string currentEvent { set { if (CURRENT_EVENT == value) return; CURRENT_EVENT = value; if (CURRENT_EVENT == "이벤트 시작") startEvent(); else if (CURRENT_EVENT == "이벤트 종료") endEvent(); /* ... */ } get { return CURRENT_EVENT; } } Dictionary와 del.. 2022. 3. 18.
C++ 스마트 포인터 : unique_ptr C, C++ 전체 링크 참고 - 전략 패턴 (Strategy Pattern) unique_ptr는 하나의 포인터만 허용하도록 하는 스마트 포인터다. unique_ptr는 해당 자원에 대한 유일한 소유권을 가지는 특징 덕분에 메모리 누수를 방지하고 자원 관리를 간편하게 해준다. (RAII, Resource Acquisition Is Initialization 객체가 소멸될 때, 자동으로 해당 메모리가 해제된다.) unique_ptr는 얕은 복사가 발생할 가능성을 사전에 차단한다. 즉, 오직 하나의 포인터만 존재할 수 있도록 한다. 여러 포인터가 동시에 하나를 가르킬 수 없도록 막는다. 따라서 아래의 myFood를 선언한 후, unqFood가 myFood를 가르키게 하는 것은 모두 컴파일 에러다. uniqu.. 2021. 10. 16.
C++ 스마트 포인터 : weak_ptr C, C++ 전체 링크 shared_ptr처럼 가리키는 대상에 참조 형식으로 포인팅하지만, counter에 영향을 주지 않는다. 그리고 weak_ptr이 소멸하더라도 대상 객체를 삭제하지 않는다. shared_ptr을 사용해야하지만 counter는 하지 않을 때 필요하다. FOOD 클래스에 어울리는 음식을 set하는 기능이 추가되었다고 하자. setWithFood는 shared_ptr의 객체를 받아 withFood에 설정한다. #include #include // shared_ptr, weak_ptr header #include using namespace std; class FOOD { private: int price = 0; shared_ptr withFood; public: FOOD() { pri.. 2021. 10. 14.
C++ 스마트 포인터 : shared_ptr C, C++ 전체 링크 shared_ptr은 포인팅 횟수를 계산해서 0이 되면 객체를 소멸하는 스마트 포인터이다. 아래 코드의 결과를 확인해보자. #include #include // shared_ptr header #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { printf("FOOD created\n"); } ~FOOD() { printf("FOOD deleted\n"); } virtual void printName() { cout 2021. 10. 12.
C++ 스마트 포인터 : auto_ptr C, C++ 전체 링크 auto_ptr은 동적 할당한 인스턴스를 자동으로 삭제하는 스마트 포인터지만, 사용하지 않는 것이 바람직하다. 배열에 대한 기능을 지원하지 않고, 얕은 복사에 대해 문제가 있다. auto_ptr을 사용하기 위해서는 memory header가 필요하다. 이제 아래 코드를 실행해보자. #include #include // auto_ptr header #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { printf("FOOD created\n"); } ~FOOD() { printf("FOOD deleted\n"); } virtual void printName() { cout 2021. 10. 10.
C++ 스마트 포인터 (Smart Pointer) C, C++ 전체 링크 스마트 포인터는 동적 할당한 메모리를 자동으로 해제해주는 편리한 포인터다. auto_ptr 동적 할당한 인스턴스를 자동으로 삭제 shared_ptr 포인팅 횟수가 0이 되면 삭제 weak_ptr counting 하지 않은 shared_ptr unique_ptr 하나의 포인터만 허용 2021. 10. 3.
허상 포인터 (Dangling Pointer) C, C++ 전체 링크 아래와 같은 코드를 실행해보자. #include #include void test() { int* ptr = (int*)malloc(sizeof(int) * 10); /* heap 할당 */ printf("address of ptr : %x\n", ptr); for (int i = 0; i < 10; i++) ptr[i] = i; for (int i = 0; i < 10; i++) printf("%d ", ptr[i]); putchar('\n'); free(ptr); for (int i = 0; i < 10; i++) printf("%d ", ptr[i]); putchar('\n'); for (int i = 0; i < 10; i++) ptr[i] = i; for (int i = .. 2021. 7. 18.
C++ 포인터와 참조자 (pointer vs reference) C, C++ 전체 링크 포인터와 참조자 모두 call by reference로 함수 내에서 변수의 값을 변경할 수 있다. 포인터는 선언 시에 주소를 할당할 필요가 없고, 나중에 다른 주소를 할당할 수 있지만, 참조자는 반드시 처음에 변수를 할당하고, 나중에 변경할수도 없다. 포인터가 함수로 넘어가면 새로운 포인터에 포인터의 주소를 복사하기 때문에 메모리가 필요하지만, 참조자는 이름만 빌리기 때문에 메모리가 필요없다. 포인터는 변수를 바꾸기 위해 * 연산자를 이용하지만, 참조자는 이름만 바뀌었으므로 그대로 변경하면 된다. 아래의 내용을 실행해서 포인터와 참조자의 차이를 비교해보자. #include void checkPointer(int* ptr) { printf("-------checkPointer----.. 2021. 5. 1.
포인터의 크기 (Size of Pointer) - 삼성 SW 역량 시험 환경 삼성 C형 전체 링크 보통 visual studio 환경에서 포인터의 크기는 4byte다. 아래의 코드를 확인해보자. #include int main() { putchar('\n'); printf("char : %d\n", sizeof(char)); printf("short : %d\n", sizeof(short)); printf("int : %d\n", sizeof(int)); printf("long int : %d\n", sizeof(long long int)); putchar('\n'); printf("char* : %d\n", sizeof(char*)); printf("short* : %d\n", sizeof(short*)); printf("int* : %d\n", sizeof(int*)); pr.. 2021. 3. 20.
반응형