>  기사  >  백엔드 개발  >  C에서 memcpy로 생성된 객체의 수명은 언제 시작됩니까?

C에서 memcpy로 생성된 객체의 수명은 언제 시작됩니까?

DDD
DDD원래의
2024-11-08 18:55:02140검색

When Does an Object Created with memcpy in C   Begin Its Lifetime?

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, &amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.