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


14

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

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

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


컴파일러의 가장 중요한 작업은 소스 코드를 컴파일하는 것이 아니라 유효하지 않은 코드를 거부하는 것입니다. malloc ()을 사용할 때는이 작업을 수행 할 수 없습니다.
Hans Passant

6
이유는 매우 간단합니다. 프로그래머가 미친 일을 할 기회가 적을수록 컴파일러가 미친 일을 할 기회가 더 많아집니다 (적극적인 최적화).
n. '대명사'm.

1
비슷한 이유로 당신은 할 수 없습니다 *reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;. C ++에는 추상 머신에 지정된 오브젝트 및 오브젝트 수명 개념이 있으며 스토리지에서 오브젝트를 작성하기위한 CPU 명령이 없다고해서 추상 머신에 차이가 없음을 의미하지는 않습니다.
맥스 랭 호프

1
@HansPassant 모든 코드를 거부하는 컴파일러는 모든 유효하지 않은 코드를 거부합니다. 어쨌든 UB가있는 프로그램을 거부하는 것은 코 필러의 일이 아닙니다.
n. '대명사'm.

답변:


7

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 상황은 다른 어떤 것보다 표준의 결함으로 간주됩니다. 이 논문의 전체 목표는 다른 사안을 해치지 않고 해당 문제 및 유사한 사례를 해결하는 방법을 제안하는 것입니다.


1

"순도"이유로.

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

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

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

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


문자열 리터럴을 사용하는 것은 엄격히 허용되지 않습니다 . type_info객체 에 대해 비슷한 CWG 문제가 있습니다. '문자열 리터럴에 대해보고 했습니까?
언어 변호사
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.