Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在面向Windows的Delphi应用程序中是否计算对象引用,如果是,其目的是什么?_C++_Windows_Delphi - Fatal编程技术网

C++ 在面向Windows的Delphi应用程序中是否计算对象引用,如果是,其目的是什么?

C++ 在面向Windows的Delphi应用程序中是否计算对象引用,如果是,其目的是什么?,c++,windows,delphi,C++,Windows,Delphi,下面给出了一个相关问题的答案(),对象引用是否在面向Windows的Delphi应用程序中计算 即: Q1A以下对象在第二条语句后的引用计数是否为2 o1 := TMyObject.Create; o2 := o1; Q1B从上面开始,将o1分配到nil会将参考计数降低到1吗 o1 := nil; Q1C接下来,将o2分配给nil是否会将参考计数降至0 o2 := nil; Q1D向前看,如果上述内容正确且对象现在的引用计数为0,我理解编译器不会自动释放对象(o2.free应该在上述o2:

下面给出了一个相关问题的答案(),对象引用是否在面向Windows的Delphi应用程序中计算

即:

Q1A以下对象在第二条语句后的引用计数是否为2

o1 := TMyObject.Create;
o2 := o1;
Q1B从上面开始,将
o1
分配到
nil
会将参考计数降低到1吗

o1 := nil;
Q1C接下来,将
o2
分配给
nil
是否会将参考计数降至0

o2 := nil;
Q1D向前看,如果上述内容正确且对象现在的引用计数为0,我理解编译器不会自动释放对象(
o2.free
应该在上述
o2:=nil
之前调用,以防止内存泄漏)。记住,我说的是Windows目标,而不是带有自动引用计数(ARC)的移动目标


Q1E如果引用计数不能自动释放与对象相关联的内存,那么Delphi中引用点计数的准确程度是多少(例如,它是否有助于跟踪内存泄漏)?

在任何桌面平台(包括Windows)下都不会对对象实例进行引用计数。对象仅在移动平台(iOS、Android)下进行引用计数。因此问题Q1A-E是没有意义的。

正如Uli已经说过的,在桌面编译器中,对象是引用计数的。但是在移动编译器中,它们是,对于这些编译器,您的问题的答案是:

  • Q1A:是的,是2
  • Q1B:是的,会降到1
  • Q1C:是的,它将是0,对象将自动释放
  • Q1D:见Q1C
  • Q1E:见Q1C

请注意,即使在桌面编译器中,接口(以及实现它们的对象)也会被重新计数。上述答案也适用于此类接口。

不幸的是,您被另一个答案误导了。Delphi的桌面目标(Win32/MacOS)中没有对象实例的参考-仅在移动目标(Android/iOS)中。值得一提的是,虽然类在Windows桌面编译器上不是引用计数的,但字符串和动态数组是。我知道最初的问题明确提到了类实例,但当我第一次遇到具有C/C++背景的Delphi/Object Pascal(就像OP一样)时,我产生了一系列误解。还有人可能会提到可以(mis?)用作引用计数对象的接口。@DavidHeffernan:我在这个问题的答案或评论中没有看到任何误导性的东西。每次提到ARC与对象的关系时,所有的回答/评论都确保对象只适用于移动平台,而不是桌面平台。因此,如果这个问题的OP被object ARC弄糊涂了,那么他/她没有很好地阅读其他答案/评论。@Remy阅读了CantChooseServerName的答案。它断言对象是ref计数的。它没有提到桌面编译器或移动设备。这个问题专门询问桌面编译器。因此,您回答了一个没有被问到的问题。请随便问,然后回答。我知道我不仅仅回答了这个问题。我只是提供了一些额外的信息。@RudyVelthuis我认为这是评论的主要目的。(但您提供了有用的信息。)@Rudy您应该删除此答案,因为它与问题无关。询问另一个关于移动编译器的问题,并在那里添加您的答案。对具体问题的集中回答也是如此。