各种来源似乎不鼓励类型常量,而倾向于更多面向对象的技术。例如DelphiBasics,它们被描述为“非常奇怪”,并且StackOverflow Question给出了一些关于它们可能被使用的背景的背景。下面是一个真正的常量和类型常量的例子。可以键入常量是内存泄漏的来源吗?
const
RESULTS_BASIC1 = $01; // True constant
RESULTS_BASIC2: BYTE = $01; // Typed constant
我正在使用Delphi 7和FastMM4,并报告了单个TCriticalSection的泄漏。使项目选项的详细地图文件后,FastMM4堆栈跟踪显示是这样的:
402E58 [StConst][StConst][@GetMem]
40454B [WinConvert][WinConvert][d_len]
404926 [Main][Main][EXAMPLE_TYPED_CONSTANT1]
...
如果我再删除该类型的常数,同样TCriticalSection报告为被泄露......在接下来的类型化不变!在逐渐放慢一种类型的常量之后,我仍然没有接近泄漏的“真实”来源。
两个相关的问题:
1)请问一个类型不变(这实际上是一个内存地址的变量)是内存泄漏的真正原因? FastMM4能否报告错误泄漏?
2)真的应该避免输入常量,如果是的话,推荐的选择是什么?例如,假设我使用的经过处理器计时单位计数(无符号的32位整数):
dwElapsed := (GetTickCount() - m_dwLastFlashCheck);
if (dwElapsed > 2000) then
begin
m_dwLastFlashCheck := GetTickCount();
DoSomething();
end;
似乎自然定义一个“恒定”,如:
RATE_FLASH: DWORD = 2000;
// ...
if (dwElapsed > RATE_FLASH) then
// etc
相关,[delphi string leak](http://stackoverflow.com/q/5423329/576719)。 –
在你最后的问题中,不需要使用类型常量。一个真正的常量“RATE_FLASH = 2000”就足够了。编译器通常会找到正确的翻译。在某些情况下,您可以使用'RATE_FLASH = DWORD(2000)'使其更清晰。 –
@LURD:对!我将在未来使用你建议的'RATE_FLASH = DWORD(2000)',因为这看起来既清晰又真实。 – AlainD