개발자 면접 공부/C-C++

스마트 포인터의 new와 make의 차이

chogyujin 2023. 10. 3. 19:00
728x90

1. 개요

오늘은 C++의 스마트 포인터의 new와 make의 차이를 공부하겠습니다.


2. new VS make

스마트 포인터를 동적 할당하는 방식은 new랑 make_unique 등 입니다.
하지만 스마트포인터를 동적할당할때 new보다는 make를 사용하여 할당을 하는것이 매우 효과적이라고 합니다.

make는 C++14부터 나온 기법으로 스마트포인터의 동적할당을 담당하고있습니다.

그럼 new보다 나은점을 알려드리겠습니다.


3. new 보다 나은점

1. 객체의 형식이 되풀이 되지 않는다.

class Base
{
public:
	Base(){}
	~Base(){}
};

int main()
{
	auto p1 = make_unique<Base>();
	unique_ptr<Base> p2(new Base);
}

중복을 피하라는 소프트웨어 공학의 핵심이 있습니다.

소스 코드가 중복되면 컴파일 시간만 늘어나고 코드가 지저분해지며 일관성이 사라지기에 사용자 실수로 버그가 생기기가 쉬워집니다.

make함수와 auto를 사용함으로써 객체형식 Base를 한번만 사용하게 된다는 장점이 있습니다.

 

2. 예외 안전성이 훌륭하다.

 

int getP()
{
	return 5;
}

void Test(shared_ptr<Base> a,int p)
{
	
}

int main()
{
	Test(shared_ptr<Base>(new Base(), getP()));
}

Test 함수 실행순서는

1. new Base()객체 생성

2. shared_ptr생성자 실행

3. GetP()

순서가 됩니다.

 

그런데 컴파일러에 따라 실행순서가

1. new Base()객체 생성

2. GetP()

3. shared_ptr 생성자 실행

이렇게 된다고하면

이때 GetP()에서 런타임 에러가 발생하게 된다면 shared_ptr은 new base()객체를 가리키지 못하고 메모리 누수가 발생됩니다.

 

make함수를 사용할 경우 이를 한번에 처리하기 떄문에 이런 예외 상황에 대해서 안전합니다.

 

3. 최적화편에서 훌륭합니다.

2번 예에서 보듯 new를 사용시 객체를 생성한 이후 스마트포인터에 집어넣게 됩니다. 이때 겍체를 생성할 때 메모리 할당이 발생하고 이후 스마트포인터의 제어블록에 대한 할당이 발생하여 2번이 작업이 발생하게 됩니다.

make함수를 쓰게된다면 이는 한번에 제어블록에 저장되기때문에 최적화면에서 new에 비해 훌륭합니다.

엉청난 call양


3. Ref

https://blog.naver.com/PostView.naver?blogId=jh20s&logNo=222363330363&redirect=Dlog&widgetTypeCall=true&directAccess=false 

 

스마트 포인터(smart point)

일반 포인터의 문제점 1. c++에는 JAVA처럼 GC같이 할당된 메모리를 자동으로 해제시켜주는 기능이 ...

blog.naver.com

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

C++ vs C#  (1) 2024.02.18
Move Semantics  (0) 2023.10.29
Inline 에 대하여  (2) 2023.09.25
C++ 17 variant  (0) 2023.09.19
C++ 17 구조적 바인딩  (2) 2023.09.14