this one question asking the same thing이 발견되었지만 '새'부분 만 응답되었으므로 여기에 다시 나와 있습니다.delete 연산자가 정적 일 필요가있는 이유는 무엇입니까?
왜 삭제 연산자가 정적 일 필요가 있습니까? 여하튼 그것은 이해가되지 않는다. 새 연산자는 생성자가 가상 일 수 없듯이 완벽한 연산자입니다. 새 연산자도 사용할 수 없습니다. 그러나 소멸자는 상속을 사용할 때 가상 클래스가 될 수 있으며 (다형성을 통해) 사용되는 객체를 기본 클래스로 파괴 할 수 있습니다.
나는 삭제 연산자가 호출 될 때 객체가 이미 파괴되었으므로 'this'가 존재하지 않는다는 것을 알고 있습니다. 그러나 가상 소멸자와 동일한 추론을 사용하여 삭제 연산자가 객체를 만든 새 연산자와 일치하도록하는 것이 여전히 의미가 있습니다. 하지만 아무것도 (가 정적입니다 그것은 알 수 없습니다 이후
이
은, 지금 우리가A *ptr = new B();
delete ptr; // <-- fail
A의 delete 연산자 (기본값) 할 경우
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
void* operator new (size_t sz);
void operator delete (void* ptr, size_t sz);
};
을 무엇을 의미하는지라고 했어야이다 여기서 사소한 경우) 컴파일 타임에 delete-operator가 올바른 것입니다.
그러나 위의 코드를 사용하여 작은 테스트 프로그램을 만들었습니다 (새/삭제 연산자에서 malloc/free 및 delete에서 print 문 만). g ++를 사용하여 컴파일했습니다. 그것을 실행하면 예기치 않게 B의 삭제 연산자에서 출력이 생성됩니다.
내 (실제) 질문입니다. 삭제 연산자에 암시 적 '가상'이 있습니까? 이 포인터가없는 의미에서만 정적입니까? 아니면 그냥 g ++ 기능입니까?
C++ 사양을 살펴보기 시작했지만, 나는 그것에 압도 당해서 도움이된다고 인정해야합니다.
우수, 감사합니다! 나는 3.7.3에서 주변을 뒤적 거리고 있었다. ... – falstro
또한 5.3.5와 3.7.3과 12.5에도 관련성이있다. 참조 작업으로 청구되었지만 실제로는 다른 섹션에서 찾고있는 것과 관련이있는 작은 단락이 있는지를 알지 못한다면 실제로 덮어 씌울 필요가 있습니다. 찾고. –