gpt4 book ai didi

Delphi:TADoConnection 变量赋值的引用与副本

转载 作者:行者123 更新时间:2023-12-03 19:38:19 25 4
gpt4 key购买 nike

我试图了解 Delphi 如何处理作业。我有一个名为 GlobalConn 的全局连接(TADoConnection)...

我有一个使用传入的变量进行数据库调用的函数:

function MakeDBCall( AConnection : TAdoConnection )
var LocalConn : TAdoConn;
begin
LocalConn := TAdoConnection.Create(nil);
try
LocalConn := AConnection
///create the table and perform action using the LocalConn
finally
LocalConn.free;
end;
end;

将使用 MakeDbCall 调用电话( GlobalConn);
  • LocalConn := AConnection 时实际发生了什么(在函数内部)?是引用计数增加还是分配给局部变量的新副本?
  • 是否释放 LocalConn影响GlobalConn ?
  • 理想情况下,我认为制作副本比获取连接字符串并分配给局部变量并打开更好(更快)......这是一个正确的假设吗?
  • 这与 Delphi 7 和 XE7-Xe10 的处理方式不同吗?

  • 谢谢

    最佳答案

    您的代码没有按照您的想法执行。我已经发表了一些评论,试图准确解释正在发生的事情。

    function MakeDBCall( AConnection : TAdoConnection )
    var
    LocalConn : TAdoConn;
    begin
    // This creates a brand new ADO connection.
    LocalConn := TAdoConnection.Create(nil);
    try
    // This line discards the connection you've just created,
    // orphaning it (leaking the memory), and sets LocalConn
    // to point to the object passed in as AConnection.
    LocalConn := AConnection

    ///create the table and perform action using the LocalConn
    finally
    // This line frees AConnection, making your global variable invalid
    LocalConn.free;
    end;
    end;

    因此,要处理您直接提出的问题:

    1. What actually happens when LocalConn := AConnection (inside the function)? Is the reference count increased or a new copy assigned to the local variable?


    以上都不是。

    该分配丢弃了您刚刚创建的全新连接,泄漏了分配的内存, LocalConn成为指向 AConnection 的新变量,而不是副本。 TADOConnection不是接口(interface),因此不受引用计数的影响。未分配新副本 - LocalConn只是另一个变量,它指向您传递给函数的连接实例。

    1. Does freeing the LocalConn impact the GlobalConn?


    是的。它释放了 AConnection ,使对它的任何引用无效,大概是您的全局连接实例。 (它对您使用 TADOConnection.Create(nil) 创建的本地连接没有任何作用;该内存已泄漏,因为您丢弃了对它的唯一可用于释放它的引用。

    1. Ideally i presume that making a copy is better (faster) than taking the connection string and assigning to the local variable and opening... is this a correct presumption?


    可能是,如果实际上您正在制作副本,但您不是。

    1. Is this handled differently from Delphi 7 and XE7-Xe10?


    不,我在上面指出的对于从 v1 开始的每个版本的 Delphi 在处理 VCL 和 Windows 时都是相同的。 (移动设备上的 FMX 改变了一些事情,但它不会改变您仍然错误地释放全局对象的事实。)

    如果 TADOConnection实际上实现了 Assign方法,你可以使用它。但是,从文档中不清楚它是否已实现;文档链接到 TPersistent.Assign .您可以检查您实际使用的 Delphi 版本的源代码(我在这台笔记本电脑上没有 D2007),看看它是否已实现。如果是,您可以使用以下内容:
    LocalConn := TADOConnection.Create(nil);
    try
    LocalConn.Assign(AConnection);
    // Use LocalConn
    finally
    LocalConn.Free; // Frees the local copy
    end;

    关于Delphi:TADoConnection 变量赋值的引用与副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665932/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com