스마트 포인터 #108
Replies: 8 comments 2 replies
-
친절한 설명 감사합니다! c++에서 사용하는 기본적이면서도 중요한 개념인데 예시와 함께 설명해주셔서 쉽게 이해됐습니다!! |
Beta Was this translation helpful? Give feedback.
-
중요한 부분이네요! 유익한 내용 공유해주셔서 감사합니다!! |
Beta Was this translation helpful? Give feedback.
-
좋은 내용 감사합니다!😀😀 그리고 제가 이 부분이 헷갈려서 그런데
두번째 문장이 그러면 여러개의 포인터가 하나의 객체를 가르키는 것을 의미하신 것인가요?? |
Beta Was this translation helpful? Give feedback.
-
알기 쉬운 설명 감사합니다 ㅎㅎ |
Beta Was this translation helpful? Give feedback.
-
쉽지 않은 메모리 관리를 한결 수월하게 관리하도록 도와주는 좋은 정보네요!! |
Beta Was this translation helpful? Give feedback.
-
정보 공유 감사합니다!! 어려운 내용인데 잘 정리해주셨네요 😄 |
Beta Was this translation helpful? Give feedback.
-
좋은 정보 감사합니다!!! 👍👍👍 |
Beta Was this translation helpful? Give feedback.
-
정말 친절하게 설명해주셨네요! 감사합니다 🥇 |
Beta Was this translation helpful? Give feedback.
-
스마트 포인터
잘 모르지만, 얕은 지식으로 떠듬떠듬 적어 봅니다. 추가할 내용 있으시면 추가 해 주세요.
c, c++ 은 포인터를 통해서 직접 memory에 access 합니다. 그렇기 때문에 그리고 malloc이나 new 연산자로 생성된 객체들은 해당 메모리를 직접 해제 해 주지 않으면 사용하지 않는 메모리가 남습니다.(memory leak) 그리고 현재 가르키고 있는 객체를 잘못 생성해 버리면, 포인터 객체가 가르키고 있는 객체가 없어지는 에러가 생기게 됩니다. (dangling pointer) 즉,
위와 같은 메모리 사용 문제를 스마트 포인터를 사용하면 자동적으로 해결해 주기 때문에, raw pointer를 쓰는 것 보다 raw pointer를 스마트 포인터에 대입해서 사용합니다.
euphony 라이브러리에서도 두가지의 스마트 포인터가 사용되더라구요.
스마트 포인터 덕분에 코드내에 따로 destruct 하는 부분도 보이지 않구요.
일단 unique포인터에 대해 알아보겠습니다.
unique_pointer
간단하게 말씀드리자면, 하나의 객체에 하나의 포인터만 대입 할 수 있다 입니다. move를 통해 소유권을 이전할 수 있지만, 복사할 수 없습니다. memory leak를 예방 할 수 있겠네요. 왜냐하면 메모리 누수 같은 경우에는 하나의 객체에 여러가지 포인터를 참조하다가 하나의 포인터에서 해제 명령을 내리는 경우 발생 하는데, unique_pointer를 사용하면 하나의 객체에 하나의 포인터만 적용할 수 있기 때문에 memory leak가 발생하는 경우는 없겠네요.
euphony 코드를 볼게요
private: std::unique_ptr<FFTModel> fftModel
FFTModel의 경우에는 하나의 객체를 생성하면 여러 포인터가 가르킬 일 없으니까 unique포인터로 지정 해 둔 모습을 보입니다.
test code 내에서 테스트 객체를 생성할 때도 make_unique함수를 사용해 unique 포인터를 생성하는 것을 알 수 있습니다. 유니크 포인터로 객체를 생성하면 매모리 해제 또한 자동으로 해 주기 때문에 그 이점때문에 스마트 포인터를 쓰려면 그냥 유니크 포인터로 객체를 생성하면 됩니다.
shared_pointer
이것은 하나의 객체에 여러개의 포인터를 가르킬 수 있지만, shared_pointer자체에서 객체에 가르키는 pointer의 수를 세기 때문에 객체를 가르키는 pointer의 수가 0가 되면 해당 객체를 해제 합니다. dangling pointer를 예방 할 수 있겠네요.
Packet의 벡터, 즉 HexVector 같은 경우 하나의 객체가 여러개의 포인터를 가르켜야 할 일이 있는 것 같습니다. 그래서 shared_pointer를 쓴 것 같습니다.
Beta Was this translation helpful? Give feedback.
All reactions