0

我正在用 RAD Studio XE7 编写一个 Delphi 包。我最近遇到了一个奇怪的访问冲突,我不知道为什么会这样。上下文是我试图维护一个字体名称列表。所以我声明了以下类型:

ICustomFontList = TList<UnicodeString>;

在我的一个类中,我声明了一个变量,如下所示:

m_pCustomFontList: ICustomFontList;

然后,在构造函数中,我尝试像这样实例化这个变量:

m_pCustomFontList := ICustomFontList.Create;

我编译了这个包,并创建了一个使用该代码的 C++ 项目。但是,每次在构造函数中实例化 m_pCustomFontList 时,我都会在以下代码的 Begin 行(位于 System.Generics.Collections.pas 中)遇到奇怪的访问冲突:

constructor TList<T>.Create;
begin
    Create(TComparer<T>.Default);
end;

后来我发现 TStringList 对我的值来说是一个更好的选择,于是我改成了那个类型。从这一刻起,上述访问冲突就再也没有出现过。但是我无法理解问题所在。我在我的包中创建了几个 TList(或类似 TObjectList 的派生),而我声明的任何其他类型的 TList(即 UnicodeString 的 TList 除外)都没有遇到过这样的问题。那么任何人都可以向我解释为什么这个特定的 TList 在构造时会产生访问冲突吗?从理论上讲,如果这是我的愿望,或者我错了,没有什么能阻止创建 UnicodeString 的 TList?

问候

--- 编辑于 15.02.2017

这是一个在我的计算机上重现该问题的小示例。为此,应在 Delphi 中创建一个包项目,并且一个 C++ VCL 形成将使用此包的应用程序项目。在包中,创建一个新单元并复制以下代码:

unit Unit1;

interface

uses System.Generics.Collections;

type
    ICustomFontList = TList<UnicodeString>;

    TaClass = class
        private
            m_pCustomFontList: ICustomFontList;

        public
            constructor Create; virtual;
    end;

implementation
constructor TaClass.Create;
begin
    inherited Create;

    m_pCustomFontList := ICustomFontList.Create;
end;

end.

在 c++ 项目中,只需在 TForm1 的构造函数中添加这一行:

std::auto_ptr<TaClass> paClass(new TaClass());

然后构建包并运行项目

问候

4

0 回答 0