동적 할당은 객체의 수명이 생성 된 범위와 달라야하고 (범위를 더 작게 만들기 위해 유지됨) 값별로 저장하지 않는 특정 이유가있는 경우에만 필요합니다. 작업.
예를 들면 다음과 같습니다.
std::vector<int> *createVector(); // Bad
std::vector<int> createVector(); // Good
auto v = new std::vector<int>(); // Bad
auto result = calculate(/*optional output = */ v);
auto v = std::vector<int>(); // Good
auto result = calculate(/*optional output = */ &v);
C ++ 11부터 std::unique_ptr
할당 된 메모리의 소유권을 포함하는 할당 된 메모리를 처리 해야 합니다.std::shared_ptr
소유권을 공유해야 할 때 생성되었습니다. (좋은 프로그램에서 기대하는 것보다 덜 필요합니다)
인스턴스 만들기가 정말 쉬워집니다.
auto instance = std::make_unique<Class>(/*args*/); // C++14
auto instance = std::make_unique<Class>(new Class(/*args*/)); // C++11
auto instance = std::make_unique<Class[]>(42); // C++14
auto instance = std::make_unique<Class[]>(new Class[](42)); // C++11
C ++ 17은 또한 std::optional
메모리 할당을 요구하지 않도록 추가합니다.
auto optInstance = std::optional<Class>{};
if (condition)
optInstance = Class{};
'인스턴스'가 범위를 벗어나면 메모리가 정리됩니다. 소유권 이전도 쉽습니다.
auto vector = std::vector<std::unique_ptr<Interface>>{};
auto instance = std::make_unique<Class>();
vector.push_back(std::move(instance)); // std::move -> transfer (most of the time)
그래서 언제 아직도 필요 new
합니까? C ++ 11부터는 거의 없습니다. 대부분은 std::make_unique
원시 포인터를 통해 소유권을 이전하는 API에 도달 할 때까지 사용 합니다.
auto instance = std::make_unique<Class>();
legacyFunction(instance.release()); // Ownership being transferred
auto instance = std::unique_ptr<Class>{legacyFunction()}; // Ownership being captured in unique_ptr
C ++ 98 / 03에서는 수동 메모리 관리를 수행해야합니다. 이 경우 최신 버전의 표준으로 업그레이드하십시오. 붙어있는 경우 :
auto instance = new Class(); // Allocate memory
delete instance; // Deallocate
auto instances = new Class[42](); // Allocate memory
delete[] instances; // Deallocate
메모리 누수가 없도록 소유권을 올바르게 추적해야합니다! 이동 의미론도 아직 작동하지 않습니다.
그렇다면 C ++에서 malloc이 언제 필요할까요? 유효한 이유는 메모리를 할당하고 나중에 new 배치를 통해 메모리를 초기화하는 것입니다.
auto instanceBlob = std::malloc(sizeof(Class)); // Allocate memory
auto instance = new(instanceBlob)Class{}; // Initialize via constructor
instance.~Class(); // Destroy via destructor
std::free(instanceBlob); // Deallocate the memory
위의 내용이 유효하더라도 새로운 운영자를 통해서도 가능합니다. std::vector
이에 대한 좋은 예입니다.
마지막으로, 우리는 여전히 방에 코끼리가 있습니다 C
. 메모리가 C ++ 코드에서 할당되고 C 코드에서 해제되거나 다른 방법으로 해제되는 C 라이브러리로 작업해야하는 경우 malloc / free를 사용해야합니다.
이 경우 가상 함수, 멤버 함수, 클래스를 잊어 버리십시오 ... POD가있는 구조체 만 허용됩니다.
규칙에 대한 일부 예외 :
- malloc이 적합한 고급 데이터 구조로 표준 라이브러리를 작성 중입니다.
- 많은 양의 메모리를 할당해야합니다 (10GB 파일의 메모리 사본?)
- 특정 구문을 사용하지 못하게하는 툴링이 있습니다.
- 불완전한 유형을 저장해야합니다