代码之家  ›  专栏  ›  技术社区  ›  Zamrony P. Juhara

使用SetLength()调整引用计数接口的动态数组大小是否会导致内存泄漏?

  •  0
  • Zamrony P. Juhara  · 技术社区  · 5 年前

    如果我有以下引用计数接口的类型声明。

    type
        ISomeInterface = interface
           ['{xxxx-xxxx-xxx-xxxx-xxx}']
           procedure doThing();
        end;
    
        TSomeInterfaceImpl = class(TInterfacedObject, ISomeInterface)
        public
           procedure doThing();
        end; 
    ...
    var arrayOfSomeInterface : array of ISomeInterface; 
    

    以下代码是否会导致内存泄漏?

    SetLength(arrayOfSomeInterface, 1);
    arrayOfSomeInterface[0] := TSomeInterfaceImpl.create();
    SetLength(arrayOfSomeInterface, 2);
    arrayOfSomeInterface[1] := TSomeInterfaceImpl.create();
    

    据我所知,当对动态数组调用SetLength()时,它将为新的动态数组分配新内存,然后将旧数组内容复制到新数组。

    旧数组中接口的引用计数发生了什么变化。它会适当地减少吗?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Remy Lebeau    5 年前

    不,没有泄漏。

    接口和动态数组都是托管类型,编译器和RTL将正确管理它们。