development

내장 유형의 소멸자 (int, char 등)

big-blog 2020. 12. 12. 12:09
반응형

내장 유형의 소멸자 (int, char 등)


C ++에서 다음 코드는 컴파일러 오류를 제공합니다.

void destruct1 (int * item)
{
  item->~int();
}

이 코드는 거의 동일합니다. int를 다른 유형으로 typedef하면 마술이 발생합니다.

typedef int myint;

void destruct2 (myint * item)
{
  item->~myint();
}

두 번째 코드가 작동하는 이유는 무엇입니까? int가 typedef 되었기 때문에 소멸자를 얻습니까?

왜 이렇게하고 싶은지 궁금한 경우 : 이것은 C ++ 코드를 리팩토링하는 데서 비롯됩니다. 표준 힙을 제거하고 자체 제작 된 풀로 대체합니다. 이를 위해서는 새로운 배치와 소멸자를 호출해야합니다. 기본 유형에 대한 소멸자를 호출하는 것은 쓸모가 없다는 것을 알고 있지만, 그럼에도 불구하고 나중에 POD를 실제 클래스로 대체 할 경우를 대비하여 코드에서이를 원합니다.

naked int는 작동하지 않지만 typedefed는 작동한다는 것을 알아내는 것은 꽤 놀랍습니다.

Btw-템플릿 기능과 관련된 솔루션이 있습니다. 템플릿 안에 typedef 만 있으면 모든 것이 정상입니다.


이것이 일반 매개 변수에 대해 코드가 작동하도록하는 이유입니다. 컨테이너 C를 고려하십시오.

template<typename T>
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i<elements; i++)
            buffer[i].~T();
    }
};

내장형에 대한 특별한 경우를 소개하는 것은 성 가실 것입니다. 따라서 C ++를 사용하면 T가 int. 거룩한 표준은 다음과 12.4 p15같이 말합니다 .

소멸자의 명시 적 호출에 대한 표기법은 모든 스칼라 유형 이름에 사용할 수 있습니다. 이를 허용하면 주어진 유형에 대해 소멸자가 존재하는지 알 필요없이 코드를 작성할 수 있습니다.

일반 int와 typedef'ed int를 사용하는 것의 차이점은 구문 적으로 다른 것입니다. 규칙은 소멸자 호출에서 뒤에있는 ~것은 유형 이름이라는 것입니다. int그런 것은 아니지만 typedef-name은입니다. 에서 찾아보십시오 7.1.5.2.

참고 URL : https://stackoverflow.com/questions/456310/destructors-of-builtin-types-int-char-etc

반응형