사소한 기본 생성자가 동작을 수행하지 않으면 malloc을 사용하여 사소한 구성 가능한 오브젝트를 작성할 수없는 이유는 무엇입니까? :: malloc

사소한 기본 생성자에 대한 cppreference 에서 인용 한 다음 단락을 이해하는 데 어려움이 있습니다. 나는 stackoverflow를 검색했지만 여전히 명확한 대답을 얻지 못했습니다. 도와주세요.

간단한 기본 생성자는 동작을 수행하지 않는 생성자입니다. C 언어 (POD 유형)와 호환되는 모든 데이터 유형은 기본적으로 구성 가능합니다. 그러나 C와 달리 간단한 기본 생성자를 가진 객체는 std :: malloc : location-new로 할당 된 메모리와 같이 적절하게 정렬 된 스토리지를 단순히 재 해석하여 만들 수는 없습니다. 새로운 객체를 공식적으로 도입하고 잠재적 인 정의되지 않은 동작을 피하려면 필요합니다.

특히 사소한 기본 생성자가 아무 것도 수행하지 않으면 왜 저장소를 재 해석하고 주어진 유형의 객체가 있다고 가정 할 수 없습니까? 이로 인해 발생할 수 있는 정의되지 않은 잠재적 동작에 대한 몇 가지 예를 제공해 주 시겠습니까?



답변

P0593R5 는 다음 예제를 제공합니다.

struct X { int a, b; };
X *make_x() {
  X *p = (X*)malloc(sizeof(struct X));
  p->a = 1;
  p->b = 2;
  return p;
}

그리고 설명 :

C ++ 컴파일러로 컴파일 할 때 p-> a가 X 객체의 int 하위 객체에 쓰려고 시도하고이 프로그램이 X 객체 또는 int 하위 객체를 만들지 않았기 때문에이 코드에는 정의되지 않은 동작이 있습니다.

[intro.object] p1 당

개체는 통합의 활성 멤버를 암시 적으로 변경하거나 임시 개체를 만들 때 정의, 새 식으로 만듭니다.

… 그리고이 프로그램은 이런 것들을하지 않았습니다.

실제로 이것은 효과가 있으며 UB 상황은 다른 어떤 것보다 표준의 결함으로 간주됩니다. 이 논문의 전체 목표는 다른 사안을 해치지 않고 해당 문제 및 유사한 사례를 해결하는 방법을 제안하는 것입니다.


답변

“순도”이유로.

대안 및 실제 상태 는 모든 스토리지 영역에 해당 스토리지에 맞는 모든 객체가 동시에 포함된다는 것입니다. 일부위원회 위원들은 현 상태에 대해 불안해 하고 많은 사람들이 같은 장소에 (초기화되지 않은 상태에서) 무한히 많은 물건을 가지고 있다는 개념을 두려워했습니다.

스토리지 영역에 무한히 많은 수의 객체가있는 논리적 인 문제는 아무도 없었습니다.

그들이 모순되는 말을하는 표준의 각기 다른 섹션을 가지고 있었기 때문에,위원회 위원들은 방금 표준의 최악의 부분 중 하나를 심각하게 채택하기로 결정했습니다.

또한 표준의 한 부분을 진지하게 고려한다면 문자열 리터럴을 사용하는 것은 엄격하게 허용되지 않습니다.