2016-09-02 3 views
0

C++ 메모리 모델에 대한 이해에서 new []로 객체 배열을 만들고 'delete []'로 삭제할 때만 스칼라 생성자/소멸자가 사용되며 컴파일러는 내부 for 루프를 생성하여 모든 요소 위치를 반복합니다 . VC에서 왜 'delete'와 'delete []'는 스칼라 삭제 소멸자를 사용합니까?

int main() 
{ 
    B obj; 
    B* pb = new B;//no scalar constructor 
    delete pb;//scalar deleting destructor 
} 

는하지만 내가 사용할 때 '새' '[] 디버그 버전에 대한 스칼라 삭제의 descturctor', VC 여전히위한 코드를 생성 ','사용하지 않고, 하나의 요소를 작동하는 '삭제 발견했다. 오른쪽

  1. 스칼라 생성자/소멸자가없는 한 쌍에 나타나는 수 :

    그래서 제 질문은? 내 테스트 프로그램에서 발견 된 스칼라 삭제 소멸자 만 있습니다.

  2. new 또는 new []로 생성 된 모든 객체에는 스칼라 삭제 소멸자가 있어야합니까? 왜 한 요소가 여전히이 고려 사항을 가지고 있는데, 한 요소의 경우에는 예외 처리, 스택 되감기, 추가 삭제 소멸자에 의존해야하는 필요성은 없습니다. 어떤 이유?

답변

1
  1. 스칼라 생성자/소멸자 오른쪽 쌍에 표시 될 필요가 없습니다? 내 테스트 프로그램에서 발견 된 스칼라 삭제 소멸자 만 있습니다.

제가 틀릴 수도 있지만 소멸자 삭제 스칼라 유사 생성자 측 거기에 아무것도 생각하지 않습니다.

  1. new 또는 new[]에 의해 생성 된 모든 객체는, 스칼라 삭제 소멸자를해야합니까? 왜 한 요소가 여전히이 고려 사항을 가지고 있는데, 한 요소의 경우에는 예외 처리, 스택 되감기, 추가 삭제 소멸자에 의존해야하는 필요성은 없습니다. 어떤 이유?

delete ptr는 소멸자 삭제 스칼라를 호출합니다.
delete [] ptr벡터 삭제 소멸자 벡터을 호출합니다.

매우 좋은 답변은 http://www.pcreview.co.uk/threads/scalar-deleting-destructor.1428390/입니다.

VC가 소멸자가있는 클래스마다 쓴 헬퍼 기능에 대해보고 된 이름입니다.

void scalar_deleting_destructor(A* pa) 
{ 
    pa->~A(); 
    A::operator delete(pa); 
} 

'벡터 삭제 소멸자'이라고 또한 생성 된 것 자매 기능이있다 : 클래스 A에 대한 "스칼라 삭제 소멸자는"거의 비슷 입니다. 대략 같습니다 :

void vector_deleting_destructor(A* pa, size_t count) 
{ 
    for (size_t i = 0; i < count; ++i) 
     pa.~A(); 
    A::operator delete[](pa); 
}