이제 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에 선언해 놓고 사용하고 있습니다.
정보는 공유되어야 한다 쭈욱~
'Study > C++' 카테고리의 다른 글
미사용 인자 Warning 제거 매크로 (#Warning ,#UNREF, #UNREFERENCED_PARAMETER) (0) | 2021.01.06 |
---|---|
왜 유니코드를 사용하는것이 좋을까? (0) | 2021.01.06 |
#pragma warning 사용법 관련 (1) | 2021.01.06 |
warning C4800 처리를 해보자 (0) | 2021.01.06 |
c++dll을 c#에서 사용시 디버깅 (0) | 2015.10.27 |
댓글