본문 바로가기
Study/C++

std::shared_ptr 사용 시 배열 할당과 삭제 처리[c++11]

by 뿡뿡대마왕 2021. 1. 18.
반응형

이제 c++도 더 이상 메모리 관리에 대해 new / delete에 대한 처리를 좀 손놓아도 될 거 같다..

물론 필요에 따라 new / delete를 사용하는 경우도 있겠지만 이젠 우리는 스마트 포인트를 잘 사용해서

메모리 누수가 없도록 프로그램을 작성하고 있을것 이다.(그래도 꼭 누수되는 case는 있음. -_-)

 

일반적으로 다들 shared_prt로 할당하기 위해 std::make_std::make_shared라는 키워드를 통해

메모리를 할당하고 있을것이다.

 

하지만 해당 방법으로는 배열의 동적할당은 할 수 없기에 std::share_ptr을 사용하여 new 와 함께 직접 배열 메모리

할당을 진행해야 한다.

 

그리고 이와 같이 할당하면 당현

 

delete memory; 가 아니라.

delete[] memory;

 

의 형태로 삭제되어야 한다는 것은 알 고 있을것이다.

 

따라서 우리가 shared_prt을 통해 배열을 할당하였다면 ref count가 0이되어 메모리가 삭제되는 시점에는

배열 메모리 삭제 형태로 호출되도록 하여야 할 것이다.

 

만약 int 배열 5을 할당 삭제 한다 치면 아래와 같이 쓸 수 있을것이다.

 

auto pArryTest =  std::shared_ptr<BYTE> sp( new BYTE[5], std::default_delete<BYTE[]>() );

 

또는 그냥 lamda식으로 해서 아래 처럼 사용도 할 수 있을 것입니다.(아래 방법이 더 자주 쓰일듯..)

auto pArryTest = std::shared_ptr<BYTE> sp( new BYTE[5], []( BYTE *p ) { delete[] p; } );

 

위와 같이 사용하는 부분을 좀 더 간편하게 매크로로 만들어 header에 선언해 놓고 쓰면 상당히 편하므로 전 아래처럼 매크로로 선언하여 배열형태의 메모리를 할당받아 사용합니다.

 

stdafx.h --------------------------------------

template<typename T>
inline std::shared_ptr<T> MakeArray(int size)
{
       return std::shared_ptr<T>(new T[size], [](T *p){ delete[] p; });
}

 

 

test.cpp----------------------------------------auto pTestAlloc = MakeArray(10);

 

 

뭐 그냥 stdafx.h에 선언해 놓고 사용하고 있습니다.

 

정보는 공유되어야 한다 쭈욱~

반응형

댓글