2016-06-13 283 views
0

使用将旧桌面应用程序移植到RAD Studio 10.1 Berlin。应用程序最后是在C++ Builder 6中建立的(很多很多以前)。System.UStrClr访问冲突

管理整理所有的组件和外部库依赖项,但它似乎有一些与Unicode端口一直存在的问题。该应用过去主要依赖内置的String类型,现在对应于AnsiString

源代码构建,但二进制在执行任何应用程序代码之前在某处引发了访问冲突。错误堆栈跟踪:

[email protected]@@UstrClr$qqrpv + 0x12 
largest_pos 
__linkproc__ Attributebitmaps::Initialize 0x18 
__init_exit_proc 
__wstartup 

largest_pos功能做了一些数字操作 - 没有任何形式的字符串依赖。

Attributebitmaps是一个静态类,没有成员称为Initialize。在Delphi中,您可以在单元级别声明InitializeFinalize调用,但该构造不在C++ Builder中使用。

任何想法为什么在System.UStrClr会发生错误?你会去哪里挖掘更多的洞察力?

+1

在用户定义的入口点之前运行的代码通常是静态初始化程序,并且访问冲突通常不是静态对象初始化的未定义顺序的结果。 Attributebitmaps类是否依赖于正在初始化的其他静态对象? – IInspectable

+1

'Attributebitmaps'是否有'UnicodeString'成员? 'UStrClr()'是RTL为'UnicodeString'变量释放内存的函数。所以无论是'UnicodeString'变量在发布之前都会被破坏,或者调用堆栈本身被破坏,并且偶然跳入'UStrClr()'。无论哪种方式,没有看到一些真正的代码没有办法diagonose这个。 –

+0

'Attributebitmaps'没有任何'UnicodeString'成员。它依赖于'TCanvas'和一些相关的VCL类,但没有任何类型的'String'成员。感谢您的提示。只需要继续寻找。 – Ryan

回答

0

相关的在如此众多的其他职位提到的静态初始化的惨败,在这种情况下,罪魁祸首是以下模式:

.h文件:

class SomeClass { 
    static String SOME_STATIC_STRING; 
}; 

String SomeClass::SOME_STATIC_STRING("foo"); 

如果你选择使用的这样的初始化器,它应该被移动到.cpp文件。