Placement new는 특정 메모리 위치에 있는 객체에 메모리를 할당하는 방법을 제공합니다. 어레이와 함께 사용하는 것은 간단해 보이지만 이식성을 달성하는 것은 어려울 수 있습니다.
문제
다음 예를 고려하십시오.
char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS];
여기서, pBuffer에는 new[]에 의해 할당된 배열에 대한 버퍼가 포함되어 있습니다. 그러나 new(pBuffer) A[NUMELEMENTS]는 pBuffer와 동일한 주소를 반환하지 않아 잠재적으로 메모리 손상이 발생할 수 있습니다.
문제 해결
한 가지 접근 방식은 다음과 같습니다. 새로운 배치를 사용하여 각 배열 요소를 수동으로 개별적으로 배치합니다.
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
이렇게 하면 각 요소가 버퍼 내의 올바른 위치에 할당됩니다.
소멸자 처리
배열을 삭제할 때는 버퍼를 삭제하기 전에 각 요소에 대한 소멸자를 수동으로 호출하는 것이 중요합니다.
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer;
이 접근 방식은 적절한 개체 정리 및 메모리 할당 해제를 보장합니다.
결론
어레이의 새로운 배치는 할당된 주소와 반환된 주소 간의 잠재적인 불일치로 인해 이식성 문제를 야기합니다. 각 배열 요소를 수동으로 배치하고 소멸자를 처리함으로써 개발자는 이러한 문제를 극복하고 이식 가능한 코드에서 안전하게 새로운 배치를 활용할 수 있습니다.
위 내용은 이식 가능한 코드의 배열에 Placement New를 어떻게 안전하게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!