2017-09-13 3 views
2

이것은 중간에서 메서드 호출과 함께 발생하는 delete this 토론의 변형입니다.C++이 삭제 된 객체의 메소드로 돌아 가기

기본적으로 메서드 A가 메서드 B를 호출하고 메서드 B가 개체를 소멸 시키면 B에서 반환 할 때 메서드 A 내부에서 특별한 일이 발생합니까? 이런 식으로 뭔가가 :

struct test { 
    void A() { 
    B(); 
    // what happens here besides being unable to dereference `this` anymore? 
    } 
    void B() {delete this;} 
}; 

만료 된 객체의 메소드로 반환하는 것은 오래 전 개체의 메모리 위치는 더 이상 상호 작용하지 않는 한 정상적으로 진행하는 것으로 가정 할 수 있습니까?

+0

예. ]]]]]]]]]] –

답변

3

그것은이다 미세한 피사체에 :

  1. 객체는 new로 작성해야합니다. 게재 위치 new 다음에 delete이 부적절합니다.

  2. delete this; (스택 해제로 인해 함수가 다시 입력 됨)을 호출 한 후에는 멤버 함수를 호출하거나 멤버 데이터에 액세스하지 마십시오.

  3. this에 포인터 유형을 지정하지 마십시오.

따라서 귀하의 경우에는 (1을 준수한다고 가정 할 때) 아무런 문제가 없습니다.

+3

당신은 적절한 복제물을 찾을 수있는 것보다 더 빨리 답했습니다. 그건 칭찬이 아니에요. –

+0

이것은'delete this '로 인해가 아니라 객체 대기열과 병렬로 실행되는 가비지 컬렉터 때문에 나를 위해 나왔습니다. 큐가 처리되는 방식은 때때로 재귀 적 메서드 호출을 포함하므로, 죽은 객체와의 상호 작용에 대해 걱정할 필요없이 객체가 삭제되는 경우를 감지 할 수 있습니다. 그러나 스택 풀기 동작에 대한 의구심이 있었지만 조심스럽게 생각한다면 괜찮습니다. 감사합니다! –

3

아무 일도 일어나지 않을 것입니다. 물론 마음에 관심을 지불하는 명백한 가지가 있습니다 :

  • 는 개체 this 점에이 new로 할당 된 있는지 확인하십시오.
  • B() 뒤에 다른 멤버 함수를 호출하지 말고 B() 뒤에 멤버 변수에 액세스하지 마십시오.
  • B() 이후의 항목에는 this을 사용하지 마십시오. 포인터 자체조차도 사용하지 마십시오.
+1

"특히"어떤 의미인지 명확하게 설명하지 않으시겠습니까? – Bathsheba

+1

@ Bathsheba 나는 잘 모른다. –