>백엔드 개발 >C++ >새로운 배치를 사용할 때 '삭제'가 실제로 올바르게 할당 해제됩니까?

새로운 배치를 사용할 때 '삭제'가 실제로 올바르게 할당 해제됩니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 12:50:02826검색

 When Using Placement New, Does `delete` Actually Deallocate Correctly?

배치 신규 및 삭제

C에서는 연산자 오버로딩을 통해 사용자 정의 신규 및 삭제 연산자를 사용할 수 있습니다. 그러나 이로 인해 이러한 연산자로 할당된 메모리를 올바르게 할당 해제하는 방법에 대한 의문이 제기됩니다. 다음 코드 조각을 고려해보세요.

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

delete (char*)buf; // OR delete buf;</code>

메모리 할당 해제 작업을 오버로드된 삭제 연산자(직접 메서드)에 위임하는 것이 논리적인 것처럼 보입니다. 그러나 이 접근 방식은 올바르지 않습니다.

올바른 방법

이 경우 메모리 할당을 해제하는 올바른 방법은 객체에 대한 소멸자를 명시적으로 호출한 다음 연산자를 호출하는 것입니다. 할당된 메모리를 해제하는 삭제 함수:

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

설명

미리 할당된 메모리 주소를 사용하는 배치 new 연산자를 사용할 때 기본 생성자는 다음과 같습니다. 자동으로 호출되지 않습니다. 따라서 소멸자를 수동으로 호출하는 것이 중요합니다. 또는 delete buf를 직접 호출하는 것도 올바르지 않습니다. 전역 연산자 delete만 호출하므로 배치 새 할당에 대해 알지 못합니다.

Buf->~Buffer()를 사용하는 경우

배치 new 연산자를 사용할 때마다 소멸자 호출(buf->~Buffer())이 필요하며, 이후에 ::operator delete 함수가 호출되는 경우에도 필요합니다.

모범 사례

혼란을 피하려면 항상 다음과 같이 일치하는 연산자 쌍을 사용하세요.

  • ::operator new 및 ::operator delete
  • new() 및 delete() (새로 배치/삭제)

위 내용은 새로운 배치를 사용할 때 '삭제'가 실제로 올바르게 할당 해제됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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