>  기사  >  백엔드 개발  >  C에서 새로운 배치로 할당된 메모리를 올바르게 할당 해제하는 방법은 무엇입니까?

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-30 18:24:03680검색

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

placement new 및 delete Conundrum

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

해결책 1:

<code class="c++">const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;</code>

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

해결책 2:

<code class="c++">const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;</code>

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

올바른 해결 방법:

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

<code class="c++">buf->~Buffer();
::operator delete(mem);</code>

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

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

위 내용은 C에서 새로운 배치로 할당된 메모리를 올바르게 할당 해제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.