2017-10-20 11 views
2

알고있는 한, memcpy을 초기화되지 않은 저장소에 넣고 cannot 안전하게 소스 개체의 복사본을 만드는 데 사용하십시오.새로운 표준의 memcpy 평생 초기화 규칙에 대한 변경 사항은 무엇입니까?

그러나, 오픈 표준의 WG21 "UB"목록에 작년 this thread에서, 참가자가 참조하는 새로운 방어 적이기 수명-개시 규칙 :

이 상승하지 않는 것 버그 리포트의 레벨이지만, 은 새로운 memcpy lifetime-initiation 규칙과 관련 될 수 있습니다. 그들은 일부 정적 유형을 원본 및 대상 바이트로 간주합니까?

질문 입력 소거 예제 코드 소량의 컨텍스트에 기초하여,이를 통해 memcpyaligned_storage 새로운 객체를 생성과 관련 될 수 있다는 것을 보인다.

검색 할 때마다 새 규칙에 대한 참조를 찾을 수 없습니다. 특히 이미 생성 된 객체의 내용을 대체하는 데만 적용되는지 또는 초기화되지 않은 메모리에서 객체의 잠재적 생성을 둘러싼 상황을 변경하는 경우에 특히 흥미 롭습니다.

+0

"알고있는 한, 초기화되지 않은 저장소에 memcpy를 사용하면 원본 개체의 복사본을 안전하게 만들 수는 없습니다."예,하지만 심각하게 std를 복용하는 뻐꾸기 땅에서만 가능합니다. 위원회의 대부분의 사람들이 그들이 무엇을하는지 거의 알지 못한다는 것을 알고 있다면 ... – curiousguy

답변

4

문구가 조금 바뀌었지만 일반적인 생각은 그대로입니다. intro.object 가입일 :

객체새로운 표현 의해, 정의에 의해 생성되는 내재적 활성 조합의 부재 또는 변경시 임시 객체가 생성 될 때 ([conv.rval] , [class.temporary]).

이들은 인데 네 가지 방법으로 C++에서 개체를 만들 수 있습니다. memcpy은 이러한 네 가지 조건 중 하나에 속하지 않으므로 수명을 생성하지 못합니다 (암시 적으로 활성 상태의 공용 멤버를 변경하면 을 통하지 않고 via = only을 수행 할 수 있음).

인용문은 특정 상황에서 이러한 능력을 가진 memcpy을 축복 할 수있는 가상의 장래의 표준 변경을 나타냅니다. 올해 초에 주제에 very long thread도있었습니다.

+2

사람들. 이것은 언어가해야한다고 생각하는 것에 대해 토론 할 수있는 적절한 장소가 아닙니다. – Barry

+0

설명은 확장 토론이 아닙니다. 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/157388/discussion-on-answer-by-barry-what-are-the-changes-if-any-to-the- memcpy-lifeti). –