배치 신규 및 삭제
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 함수가 호출되는 경우에도 필요합니다.
모범 사례
혼란을 피하려면 항상 다음과 같이 일치하는 연산자 쌍을 사용하세요.
위 내용은 새로운 배치를 사용할 때 '삭제'가 실제로 올바르게 할당 해제됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!