TDemo.TBuilder स्वचालित रूप से मुक्त क्यों नहीं है और स्मृति रिसाव का उत्पादन क्यों नहीं कर रहा है? TDemo.TBuilder को स्वचालित रूप से मुक्त किया जाना चाहिए, क्योंकि यह IInterface पर आधारित एक TInterfacedObject ऑब्जेक्ट है

type
  TDemo = class
    public type
      TBuilder = class(TInterfacedObject)
        public
          function Generate: TDemo;
      end;
    public
      class procedure Using;
  end;

implementation

function TDemo.TBuilder.Generate: TDemo;
begin
  Result := TDemo.Create;
  // on finish this method, TDemo.TBuilder should be freed ! 
end;

class procedure TDemo.Using;
begin
  with TDemo.TBuilder.Create.Generate do try
    // use TDemo
    
  finally
    Free;
  end;
end;
1
THSoftPoland 9 पद 2020, 13:54

1 उत्तर

सबसे बढ़िया उत्तर

आपके पास मेमोरी लीक है क्योंकि TBuilder.Create ऑब्जेक्ट रेफरेंस देता है और चूंकि इसे कॉल के साथ इंटरमीडिएट रेफरेंस के रूप में उपयोग किया जाता है, इसे कभी भी इंटरफेस रेफरेंस को असाइन नहीं किया गया था और इसकी रेफरेंस काउंटिंग मैकेनिज्म को कभी भी ठीक से इनिशियलाइज़ नहीं किया गया था।

इसे हल करने के लिए, आपको IBuilder इंटरफ़ेस घोषित करना होगा और ऐसी मध्यवर्ती वस्तु के निर्माण के लिए उस इंटरफ़ेस को वापस करने वाले क्लास फ़ंक्शन का उपयोग करना होगा।

  TDemo = class
  public type
    IBuilder = interface
      function Generate: TDemo;
    end;

    TBuilder = class(TInterfacedObject, IBuilder)
    public
      function Generate: TDemo;
      class function New: IBuilder;
    end;
  public
    class procedure Using;
  end;


class function TDemo.TBuilder.New: IBuilder;
begin
  Result := TBuilder.Create;
end;

  with TDemo.TBuilder.New.Generate do
  ... 
6
Dalija Prasnikar 9 पद 2020, 12:24