"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++에서 새로운 배치로 할당된 메모리를 올바르게 할당 해제하는 방법은 무엇입니까?

C++에서 새로운 배치로 할당된 메모리를 올바르게 할당 해제하는 방법은 무엇입니까?

2024-11-07에 게시됨
검색:695

How to Properly Deallocate Memory Allocated with Placement New in C  ?

placement new 및 delete 수수께끼

C에서 배치 new 연산자를 사용하여 메모리를 할당할 때 할당 해제를 위한 적절한 방법에 관한 딜레마가 발생합니다. 그 기억. 두 가지 잠재적인 솔루션을 살펴보겠습니다.

솔루션 1:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;

이 솔루션은 할당된 메모리를 문자 포인터로 삭제하려고 시도합니다. 그러나 이 접근 방식은 객체의 소멸자를 적절하게 처리하지 않거나 원시 메모리 할당을 해제하지 않기 때문에 올바르지 않습니다.

해결책 2:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;

이 솔루션도 할당된 메모리를 삭제하려고 시도하지만 Buffer* 포인터에서 삭제 연산자를 직접 호출합니다. 이는 일반 new 연산자를 사용하여 메모리를 할당한 경우 작동합니다. 그러나 새로운 배치가 사용되었으므로 이 접근 방식도 올바르지 않습니다.

올바른 해결 방법:

할당된 메모리를 해제하는 올바른 방법은 다음과 같습니다.

buf->~Buffer();
::operator delete(mem);

이 솔루션은 Buffer 객체(buf->~Buffer())에 대한 소멸자를 명시적으로 호출한 다음 연산자 삭제 함수(::operator delete()를 사용하여 원시 메모리 할당을 해제합니다. mem)).

여기서 중요한 차이점은 배치 new를 사용할 때 원시 메모리를 해제하기 위해 연산자 삭제 함수를 직접 호출해야 한다는 것입니다. 배치 new 연산자에서 얻은 포인터를 삭제하려고 시도하면 소멸자를 제대로 호출하지 않거나 메모리를 완전히 할당 해제할 수 없습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3