这是前一个问题的一个子集.
作为练习,我正在编写一个内存管理器 - 即实现malloc,realloc和free(或new和delete)的代码.我的语言Delphi 的RTL允许轻松替换RTL的内存管理器.对于那些使用C++的人来说,这类似于,但是低于覆盖新的和删除(它挂钩到RTL本身而不是语言功能.)
我正在寻找有关高质量方法的资源,其他人已经解决了同样的问题,并试图找出其他主要编译器供应商使用的算法.虽然Delphi有很好的文档记录,但我找不到有关MS VC++,.Net或Objective C所使用的实现的任何信息.这些供应商似乎(?)不允许他们的RTL像Delphi那样被挂钩.所有文档似乎都是更高级别的,例如NSAutoReleasePool选择一个随机的例子 - 对于这个问题来说太高级了.
主要供应商(Microsoft VC++和.Net以及Apple Objective C)在其运行时库中使用哪些内存管理算法?
一个很好的答案的例子是描述内存管理器实现的文档,例如这个,或者是发布论文的链接.一个有用的答案的例子是算法,'VC++运行时使用Hoard分配器 '.
我已将项目从RAD Studio 2010升级到RAD Studio XE4.该项目主要是使用C++ Builder的一半RAD Studio进行的C++,其中包括Delphi的一些内容.
在2010年,Release版本为22MB.在XE4下,相同的Release版本为55MB.
这是一个问题,因为:
是什么导致这种情况,我该如何解决?
<UsePackages>True</UsePackages>Release not Debug中存在的东西; 删除它没有任何区别.除此之外,还启用了代码优化,缺少_DEBUG定义.{$WEAKLINKRTTI ON}.该XE4文件没有提到一个相当的C++编译链接.有#pragma explicit_rtti(C++类似物{$RTTI})和__declspec(delphirtti)(C++类似物{$M}/{$TYPEINFO}).我正在尝试重新配置我的应用程序以大量使用包.我和另一个运行类似实验的开发人员在使用多个不同的包进行链接时遇到了一些麻烦.我们可能都做错了什么,但善良知道什么:)
情况是这样的:
PackageA.bpl包含C++类FooA.该类使用该PACKAGE指令声明.第二个包,PackageB.bpl包含一个继承自FooA,被调用的类FooB.它包含FooB.h,并且包使用运行时包构建,并PackageA通过添加引用链接到PackageA.bpi.
在构建时PackageB,它编译得很好,但链接失败了许多未解析的外部,其中前几个是:
[ILINK32 Error] Error: Unresolved external '__tpdsc__ FooA' referenced from C:\blah\FooB.OBJ[ILINK32 Error] Error: Unresolved external 'FooA::' referenced from C:\blah\FooB.OBJ[ILINK32 Error] Error: Unresolved external '__fastcall FooA::~FooA()' referenced from blah\FooB.OBJ等等
在PackageA.bpl节目上运行TDump :
Exports from PackageA.bpl
14 exported name(s), 14 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的间歇性崩溃,只有在我解决问题的某些情况下才会发生,我正在寻求如何解决它的建议.
在显然随机的点上,Windows显示"[App]已停止工作"对话框.它是ntdll.dll中的APPCRASH,异常代码4000001f,异常偏移量000a2562.这是它变得棘手的地方:只有在调试器下运行应用程序时才会出现这种情况.但是,调试器不会捕获此异常,并且在Windows显示此对话框时,IDE没有响应.正常运行时不会发生此错误,即不在IDE调试器中.

我无法在调试器外重现它,因此我无法运行程序并在它已经崩溃时附加.当Windows显示此对话框时,我无法暂停执行,因为IDE没有响应.我可以手动跟踪代码行以查看它出现的位置.有几个,它发生的地方显然是随机的.有一段时间,它在创建一个线程时显示一个窗口(或新表单)一段时间.
编辑:我已将其跟踪到IDE:如果我暂停一个断点并单击"线程状态"选项卡,程序将立即使用上面的对话框崩溃,即使它理论上已暂停.在这种情况下,IDE仍然保持响应.这真的很奇怪.
我刚刚将我的开发环境转移到了VMWare Fusion.从我的新计算机上的旧(本机Windows)计算机运行构建时,也会发生该错误; 它在旧计算机上的相同EXE文件中没有出现.这让我想知道它是否与Fusion或我的新设置中的某些内容有关.
我在跑步:
我有一个有趣的数据结构设计问题,超出了我目前的专业知识.我正在寻找解决这个问题的数据结构或算法答案.
要求:
(pointer address, size)在一个位置存储合理数量的对(实际上是两个数字;第一个用作排序键)(address, size)对内 - 即,如果该对定义了内存范围,则指针是否在列表中的任何范围内.线程将更少地添加或删除此列表中的条目.我希望避免一个天真的实现,例如有一个关键部分来序列化对排序列表或树的访问.哪些数据结构或算法可能适合此任务?
用Delphi标记,因为我正在使用该语言执行此任务.语言无关的答案非常受欢迎.
但是,我可能无法使用任何语言的任何标准库而不需要太多关心.原因是内存访问(对象的分配,释放等及其内部存储器,例如树节点等)受到严格控制,必须通过我自己的功能.我在同一程序中其他地方的当前代码使用红/黑树和一点点特里,我自己写了这些.对象和节点分配通过自定义内存分配例程运行.这超出了问题的范围,但这里提到的是为了避免像'使用STL结构foo'这样的答案.我热衷于算法或结构答案,只要我有正确的参考或教科书,我就可以实现自己.
delphi algorithm multithreading thread-safety data-structures
在哪里可以找到德尔福精神奖获奖者的完整名单?
我找到了这个,但还不完整.
我有兴趣尝试在我的应用程序中嵌入Python,让用户在应用程序环境中运行Python脚本,访问内部(C++实现的)对象等.我对此很新,所以不知道到底是什么我正在做.
我已经阅读了在另一个应用程序中嵌入Python,虽然这似乎只涉及C API和平面C函数,而不是类或对象(除非我遗漏了一些东西),它的"在C++中嵌入Python"一节只有两句话.但是,我也遇到过如何使用boost :: python这看起来很棒.
有一个问题:C++ Builder 2010不支持 boost :: python .
因此,考虑到这一点,在使用C++ Builder 2010编译的C++应用程序中嵌入Python的最佳方法是什么,并且使用最好的技术,如何公开/集成类和对象以使Python编码器能够访问对象 -面向程序的内部? 我错过了标准方法吗?将内部类或实例化对象作为对象简单地暴露给Python,或者API是真正的C风格还是平面/非OO,如果是这样,通过这样的API模拟底层OO层的最佳方法是什么?
注意:我实际上使用的是RAD Studio,它包括C++ Builder和Delphi.有可能使用某种特定于Delphi的绑定,但我遇到的是六七年,或者是新的(Python 2.6),但似乎没有任何文档,并且问题列表中的评论如"任何人都在阅读thiese [sic]评论?是否有人参与此项目?"这并不令人鼓舞.但请随意添加特定于Delphi的答案,特别是如果您认为它们可能会在组合的D + CB应用程序中运行.我很欣赏所有答案,即使它们不是很完美 - 我可以研究,我只需要指点去哪里.但是,原生C++解决方案可能是理想的,因为使用VCL派生的对象有其自身的局限性.
感谢您的输入!
我正在尝试将GLScene安装到RAD Studio 2010中,目的是从大多数C++项目中使用它.我下载了最新的快照(5991,2011年11月)并且一直在尝试编译和安装两个主要的软件包: GLScene_DesignTime和GLScene_RunTime.我甚至没有尝试过其他一些库(CUDA等),我只想让基本软件包运行.
我遇到了一些问题,其中一个是我无法解决的问题,而且我正在寻求那些已成功安装GLScene的人的帮助,或者可能知道如何解决这些Delphi编译器错误.
编译时,许多文件都出现以下错误:
[DCC Warning] GLSelection.pas(297): W1025 Unsupported language feature: 'abstract class method'
Run Code Online (Sandbox Code Playgroud)
这是由方法声明引起的:
TGLBaseSelectTechnique = class
public
class function IsSupported: Boolean; virtual; abstract;
Run Code Online (Sandbox Code Playgroud)
似乎Delphi 2010中不支持虚拟抽象类方法,我通过删除' abstract'并提供虚拟实现来解决它,例如只返回false.
我现在遇到两个更严重的错误.编译时,编译器失败如下:
[DCC Fatal Error] Exception EAccessViolation: Access violation at address 05AE8ED9 in module 'dcc140.dll'. Read of address 00000003
[DCC Error] Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
Run Code Online (Sandbox Code Playgroud)
它没有说明是什么文件引起了这个,但我认为它是由它造成的Spline.pas.偶尔也不经常,我得到这个:
[DCC …Run Code Online (Sandbox Code Playgroud) 如何在Delphi IDE中实现叠加图标,如下所示:

我们的应用程序充当COM服务器,其中所有自动化都发生在单个STA公寓内(在应用程序的主线程中),并且一些进行冗长(> 10分钟)调用的VBS脚本失败,并显示错误"系统调用失败(80010100)" .一些研究(一,二,三)表明这可能是由消息队列填满引起的,因此当COM尝试调用下一个方法时,它无法进行.
如果它很重要,该应用程序是使用Embarcadero RAD Studio 2010开发的(主要是C++,对于某些COM类的Delphi.)
我想我会在漫长的COM方法调用结束时检查线程的消息队列(即,在它返回之前),通过使用GetQueueStatus和查看它包含的内容PeekMessage.虽然看起来队列已经满了,但我看到了一些奇怪的行为,我无法弄清楚为什么PeekMessage它的行为方式,以及为什么队列已满 - 即它充满了什么.
前面稍微冗长的解释:
像这样的代码:
int iMessages = 0;
DWORD dwThreadId = GetCurrentThreadId();
while (::PostThreadMessage(dwThreadId, WM_USER, 0, 0)) {
iMessages++;
}
if (GetLastError() == ERROR_NOT_ENOUGH_QUOTA) {
String strError = L"Not enough quota, posted " + IntToStr(iMessages) + L" messages";
// Do something with strError
}
Run Code Online (Sandbox Code Playgroud)
当在一个简短的COM调用方法结束时运行可以发布数千(例如,9996)消息; 在导致脚本失败的冗长方法调用结束时,它可以发布0.我的结论是消息队列已满是真正导致问题的原因.我的系统的消息队列限制是默认值10000(请参阅"备注"部分.)
调用Application->ProcessMessages()(调用应用程序的消息循环,直到它为空,对于那些不是Delphi/C++ Builder用户的人来说 - …