KoreanFoodie's Study

C++ DevNote : 생성자를 private 하게 만드는 이유 (feat. make_shared 대신 new 를 사용한다고?) 본문

Tutorials/C++ : Expert

C++ DevNote : 생성자를 private 하게 만드는 이유 (feat. make_shared 대신 new 를 사용한다고?)

GoldGiver 2023. 9. 14. 19:31

C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다

생성자를 private 하게 만든다고?

스마트 포인터에 배우다 보면, make_shared 와 new 를 이용해 스마트 포인터를 만드는 방식에 대해 배우게 된다.

이때, 효율성을 위해 make_shared 를 new 보다 선호하라는 말을 듣게 되는데, 그 이유는 명확하다(힙 할당이 2번 대신 1번 이루어지며, 같은 메모리 조각에 놓이는 데다가, new 에서 예외가 발생했을 때의 메모리 누수도 막을 수 있으니까).

 

그런데... 그럼에도 불구하고 new 를 사용해야 하는 경우를 보면, 크게 2가지 이유가 나온다.

  1. 커스텀 삭제자를 사용하는 경우
  2. 생성자가 private 인 경우

 

100번 양보해서, 1번은 그렇다 쳐도, 2번은 직관적으로 와닿지가 않는다. 생성자를 private 하게 만들어야 할 이유가 어디 있단 말인가?

 

2023/09/15 수정 : 커스텀 삭제자를 이용해 풀링을 하는 기법에도 사용된다

 

그 이유를 찾던 중, stackoverflow 에서 그럴듯한(?) 이유를 발견하여 기록한다 😂

일단, 몇몇 임베디드 시스템에서는 시스템 시작 이후에 메모리 동적 할당을 금지하고 있다고 한다(사실 문서는 귀찮아서 읽지 않음). 즉, 힙 메모리를 맘대로 사용하는 게 안된다는 것이다.

 

또다른 이유로는... 해당 클래스를 사용할 때, 반드시 스마트 포인터 형식으로 쓰게 강제하도록 Factory 함수를 따로 만든다... 같은 이유도 있었다.

 

그래서 뭐, 실제로 팩토리 함수를 만든다고 하면 아래와 같이 구현해 볼 수 있을 것이다 😎

class Foo {
public:
    static Foo *Create() {
         return new Foo;
    }
private:
    Foo() {}
};

int main()
{
    Foo* foo = Foo::Create();
}

음.. 일단 어느 정도 궁금증은 해소되었지만, 사실 아직은 크게 와닿지 않는다 😅

다음에 한번 시험삼아 사용해 보겠다 ㅋㅋ

Comments