> 백엔드 개발 > C++ > 본문

배열에 새로 배치하면 C에서 이식성이 보장됩니까?

Patricia Arquette
풀어 주다: 2024-11-12 16:48:02
원래의
405명이 탐색했습니다.

Does Placement New on Arrays Guarantee Portability in C  ?

배치 New 배치가 이식성을 보장할 수 있습니까?

placement new는 C에서 배열을 초기화하는 수단을 제공하지만 배열에 대한 사용은 잠재적인 가능성을 제공합니다. 이식성 문제. 특히 new[]에서 얻은 포인터가 제공된 주소에서 벗어날 수 있어 배열에 대한 버퍼 할당을 방해할 수 있습니다.

표준 5.3.4, 참고 12에서는 이러한 불일치를 인정하여 버퍼 할당을 어렵게 만듭니다. 배열에 적합한 크기. 다음 예에서는 문제를 강조합니다.

int main() {
  const int NUMELEMENTS = 20;
  char *pBuffer = new char[NUMELEMENTS * sizeof(A)];
  A *pA = new(pBuffer) A[NUMELEMENTS];

  // With Visual Studio, pA will be four bytes higher than pBuffer
  printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
}
로그인 후 복사

이 예에서 컴파일러는 버퍼의 처음 4바이트에 배열 요소 수를 저장하는 것으로 보입니다. 결과적으로 버퍼가 sizeof(A) * NUMELEMENTS바이트의 공간으로만 할당되기 때문에 메모리 손상이 발생합니다.

이식성 문제 방지:

이러한 이식성을 완화하려면 문제가 있는 경우 다음 접근 방식을 고려하십시오.

  • 수동 배치 신규: 어레이에서 신규 배치를 사용하는 대신 이를 사용하여 각 어레이 요소를 개별적으로 초기화합니다. 예:
int main() {
  const int NUMELEMENTS = 20;
  char *pBuffer = new char[NUMELEMENTS * sizeof(A)];
  A *pA = (A*)pBuffer;

  for (int i = 0; i < NUMELEMENTS; ++i) {
    pA[i] = new (pA + i) A();
  }

  printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
}
로그인 후 복사
  • 수동 파기: 메모리 누수를 방지하려면 버퍼를 삭제하기 전에 각 배열 요소를 수동으로 파기하세요.

new[] 배치에 대한 추가 오버헤드는 구현 및 클래스 정의에 따라 달라질 수 있다는 점에 유의하는 것이 중요합니다. 그럼에도 불구하고 이 수동 접근 방식은 다양한 컴파일러 간의 이식성을 보장하고 오버헤드를 동적으로 확인할 필요가 없습니다.

위 내용은 배열에 새로 배치하면 C에서 이식성이 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿