C에서 memcpy를 사용한 불확실한 객체 생성
C에서는 객체가 할당되면 객체의 바이트 버퍼가 소스에서 복사됩니다. 그러나 이 복사의 정확한 메커니즘은 지정되지 않아 객체의 수명에 대한 의문이 제기됩니다.
다음 코드 조각을 고려하세요.
#include <cstdlib> #include <cstring> struct T // trivially copyable type { int x, y; }; int main() { void *buf = std::malloc( sizeof(T) ); if ( !buf ) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
이 코드에서는 malloc을 사용하여 버퍼가 할당됩니다. 그런 다음 복사 가능한 간단한 객체 a가 memcpy를 사용하여 이 버퍼에 복사됩니다. 복사된 객체에 대한 참조는 b에 저장됩니다.
질문은: b가 가리키는 객체의 수명은 언제 시작됩니까? 즉, memcpy를 사용하여 복사하거나 b?
불분명한 표준
C 표준은 현재 이 문제에 대해 침묵하고 있습니다. "객체 수명, 저수준 프로그래밍 및 memcpy"라는 제목의 논문에서는 간단하게 복사 가능한 유형에 memcpy를 사용하는 것을 객체 구성으로 인식할 것을 제안하고 있지만 아직 논의되거나 표준에 통합되지 않았습니다.
초안 표준 해석
C 14 초안 표준에서는 객체가 정의될 때 생성되거나, new-expression을 사용하여 생성되거나, 필요할 때 구현에 의해 생성된다고 제안합니다. 그러나 사소하게 복사 가능한 유형 복사에 대한 표준에서 다루는 사례는 이미 존재하는 객체만을 참조하는 것으로 보입니다.
암시적 객체 생성을 위한 제안
p0593 제안은 이를 해결하려는 시도입니다. 이 문제는 malloc 및 memcpy를 포함한 암시적 객체 생성 작업을 정의하여 해결됩니다. 이 제안은 아직 검토되지 않았습니다.
결론
현재 C 표준은 memcpy를 사용하여 생성된 객체의 수명이 언제 시작되는지 지정하지 않습니다. 따라서 제공된 코드 조각의 동작은 정의되지 않습니다. 제안 p0593은 이러한 모호성에 대한 잠재적인 해결책을 제공하지만 아직 표준으로 채택되지 않았습니다.
위 내용은 C에서 memcpy로 생성된 객체의 수명은 언제 시작됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!