2011-08-19 3 views
3

주어진 다음의 선언 :Ada Finalization 절차 조정 - 여기에 무엇을 넣으시겠습니까?

type Food_T is abstract tagged null record; 
    type Food_Ptr is access all Food_T'Class; 

    type Wrapper_T is new Ada.Finalization.Controlled with record 
     Ptr : Food_Ptr; 
    end record; 

    procedure Adjust (Object : in out Wrapper_T) is 
    begin 
     null; -- what goes here ? 
    end Adjust; 

나는 & 할당 (깊은 복사) 내가 Object.ptr가 가리키는 것이다 (그리고 소스 & 대상이 어디 있는지 어떤 종류의 잘 모릅니다 food_톤의 올바른 derivitive를 할당하는 방법 궁금 !).

도움을 주시면 감사하겠습니다.

감사합니다.

NWS입니다.

답변

4

난 당신 말은 생각 :

procedure Adjust (Object : in out Wrapper_T) is 
begin 
    Object.Ptr := new Food_T'Class'(Object.Ptr.all); 
end Adjust; 

그런 다음 그것은 물론, 정말 딥 카피 수 있도록 Object.Ptr.all의 일이다. (이렇게하려면 Object.Ptr.all의 형식에서 Ada.Finalization.Controlled을 파생시킬 수 있습니다.이 경우 Food_T 도출 유형을 Ada.Finalization.Controlled에서 파생시킬 수 있도록 Food_T를 interface로 만들 수 있습니다. .)

+0

@Chris, 이것이 효과가있는 것으로 보입니다. 감사. NWS. – NWS

-2

는 두 개의 인스턴스를 사용해서 B를 수행 할 때 Methods를 호출 조정 액세스 유형 T.의 A와 B가 있다고 가정하자 : = A를

그러나이 방법을 사용할 때주의 이후 제대로 사용하지 않으면 메모리 누수가 발생할 수 있습니다! 당신의 생각이 객체 A에 대한 완전히 새로운 참조를 유지하기 위해 B라면, 그것을 비워 두십시오. 이 경우 B 내의 모든 포인터는 A 내의 포인터와 같은 메모리 위치를 가리 킵니다.

값 유형 지정을 수행하려는 경우, 즉 개체를 원하는 경우 메서드를 완료하면됩니다. 동일한 "데이터"를 가지고 있지만 다른 메모리 위치에 있으므로 A를 변경하면 B는이를 인식하지 못합니다. 이 경우 Adjust 메서드 내에서 각 포인터의 값을 수동으로 할당하고 필요한 경우 내부 개체를 만들거나 해제 할 수 있습니다.