程序:Public Function Test() As Long()     Dim aryReturn() As Long
     
     Redim aryReturn(100) As Long     Text = aryReturn     Erase aryReturnEnd Function请问在释放aryRerurn后访问Test函数返回值会不会引起内存访问错误?在别的程序模块中调用Test后需不需要释放Test函数返回的数组?"Text = aryReturn"这个语句是不是将aryReturn指向的数组指针赋值给Test?

解决方案 »

  1.   

    那么调用函数Test后还要不要释放一次:
        dim aryLong() as long
        aryLong = Text()
        arase aryLong
    ???????????????????????
      

  2.   

    Msdn没做详细的解释在VB版里  不过在VC++里面 有一篇英文的KL介绍到如果分配不当 会引起一定程度的内存泄漏等等一系列的问题
      

  3.   

    Text = aryReturn
    Erase aryReturn
    我觉得第二句根本不会运行,因为在第一句运行后,函数已返回了
      

  4.   

    首先, palmkey(原水)是错误的,给函数赋返回值不会结束函数在 VB 中,数组赋值总是用的深度复制,语句 Text = aryReturn 后其实有两个内容一致的数组 Text(100) 和 aryReturn(100),所以 Erase aryReturn 是不影响数组 Text(100) 的。如果 Text = aryReturn 在整个函数的末尾(End Function 前面),VB 编译器做了优化,直接将 aryReturn(100) 的内容做为 Text() 函数的返回值而不复制数据。所以最后的 Erase 语句作为良好的编程风格是应提倡的,但在数组太大的情况下(比如容量达到 M),那么应该考虑性能将 Text = aryReturn 留在函数末尾而不显式使用 Erase。VB 不象 C,是按照 COM 安全机制设计的,只有不使用 API,它的对象、数组、字符串等所有变量都会在生命期结束后自动释放,所有 aryReturn 会在函数 Text() 结束时自动释放,aryLong 会在所在的过程结束时自动释放,不过作为良好的编程风格,用完后马上调用 Erase 语句是提倡的。VB 里面唯一会发生类似内存泄漏的情况是对象的循环引用。简单的例子就是对象 Parent 内部有一个变量 mclsChild 引用了对象 Child,而对象 Chilc 内部也有一个变量 mclsParent 引用了对象 Parent,如果你不把 mclsChilc 和 mclsParent 中的 Set Nothing,仅仅是将其他地方引用 Parent 和 Child 对象的变量进行的 Set nothing,那么 COM 机制就认为 Parent 和 Child 还在使用中(由于互相引用)而不释放,但是在你的程序中已经看不到对象 Parent 和 Child 了。虽然 Parent 和 Child 对象不受程序控制,但依旧在 COM 的控制中,严格意义上他们所占用的内存不是泄漏而是处于长时间占用状态,按照西方的文化传统,将 Parent 和 Child 对象称为“僵尸”对象。如果想提高编程水平,COM 原理是必须学习的。