ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [19] - ComPtr and Smart Pointer
    Graphics 2021. 7. 21. 19:55

    Smart pointer와 COM Pointer에 대해서 공부합니다. 이는 Resource Management 또는 자원 관리는 조금 더 안정적이고 효과적으로 할 수 있도록 도와주는 역할을 합니다. 기존 코드를 보면 어떤 메모리 공간을 할당 받았을 때 반드시 수동으로 해제를 해주는 모습을 확인할 수 있었습니다. 그래서 약간의 변화가 생겼습니다.

    이제 포인터로 선언하지 않고 Comptr로 선언합니다. Smart Pointer의 일종입니다

    그리고 보는 바와 같이 해당 Pointer의 주소가 필요할 땐 Get함수를 호출해서 사용합니다. 그냥 Standard Library의 Unique pointer를 사용하면 될 것 같은데 왜 이런 짓을 하는 걸까요? 

    일반적으로 위의 함수에서도 그렇지만 Interface를 Require할 땐 pointer를 넘겨주어야 합니다. D3D에선 대체로 Pointer의 Pointer를 사용합니다. Pointer의 Pointer를 넘겨주면 그 Pointer를 요청한 Interface의 pointer로 채워줍니다. 그런데 Unique Pointer에 대한 이야기를 하자면, Unique Pointer는 갖고 있는 Resource에 대한 Pointer가 Encapsulated 된 상태로 존재합니다. 따라서 Encapsulated 된 Resource의 Pointer의 주소를 Request하는 것이 불가능합니다. 

    그럼에도 불구하고 Unique Pointer를 사용하여 Pointer의 Pointer를 넘겨주겠다면 Dummy pointer를 만들고 그 pointer를 채우고 이 포인터를 Unique pointer로 이동 시켜서 사용해야 합니다.

    또 다른 이유는 Unique Pointer는 배타적으로 자원을 관리하도록 설계되었다는 점입니다. 그러나 Com Ptr은 Reference Count가 존재하고 이를 통해서 다수의 Pointers가 하나의 인터페이스의 자원을 사용할 수 있습니다. 그래서 Com Ptr의 경우에 복사를 하면 AddRef가 호출되면서 해당 Object에 대해 복수의 권한을 갖는 Object를 만들 수 있습니다.

    한 가지 Com Pointer에 대해서 주의해야 할 점이 있습니다. 주소를 받는 '&'연산자(or address of operator) 뒤에 오는 Com Ptr는 반드시 갖고 있는 메모리를 Release하고 나서 그 데이터를 반환한다는 점입니다. 좀 이상하게 생기긴 했습니다. 마치 Com Ptr의 주소를 달라는 것처럼 보이기도 합니다. 그런 일은 없습니다. 이 Com Ptr는 &연산자를 Encapsulated 된 Object(or resources)의 주소를 반환하도록 Overload합니다. 

    게다가, 이 Com Ptr가 어떤 COM Object를 갖고 있다면 가장 먼저 그 COM Object를 Release하고 그 Object의 주소를 반환합니다. 잘 생각해보면 제법 논리적인 수순입니다. 가령, 어떤 Pointer dump*을 다른 어떤 것으로 채우고 싶다면 먼저 갖고 있는 데이터를 Free해야 Memory Leak가 발생하지 않을 것이기 때문입니다. 하지만 언제나 Pointer를 다른 정보로 채우기 위해 Pointer를 넘기지는 않습니다. 가끔은 그냥 Pointer의 Pointer를 받고 싶고 Pointer를 다른 무언가로 채우고 싶지 않을 수 있습니다. 그런 경우엔 ComPtr의 Object에서 GetAddressOf()를 호출하면 됩니다. 이 차이에 주의해야 합니다.

     

     

     

     

     

     

    'Graphics' 카테고리의 다른 글

    [21] - My First Triangle - 2  (0) 2021.07.22
    [20] - My First Triangle - 1  (0) 2021.07.22
    [18] - Debug Layer Diagnostics  (0) 2021.07.21
    [17] - Device Init  (0) 2021.07.20
    [16] - Swap Chain  (0) 2021.07.19
Designed by Tistory.