New, dispose

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Geoff Callaghan

    #1

    New, dispose

    I have several functions that require doing a New on a local object. If the
    object is local to a sub or function, do I need to dispose of it, or will
    it just go away like any other local variable?

    Geoff Callaghan


  • Herfried K. Wagner [MVP]

    #2
    Re: New, dispose

    "Geoff Callaghan" <gcallaghan@tra keng.com> schrieb:[color=blue]
    >I have several functions that require doing a New on a local object. If the
    > object is local to a sub or function, do I need to dispose of it, or will
    > it just go away like any other local variable?[/color]

    This depends on the object, but in general it's a good idea to call the
    object's 'Dispose' method. It's not necessary to set the variables to
    'Nothing' at the end of the method because the references will be deleted
    automatically when execution exits the method.

    --
    M S Herfried K. Wagner
    M V P <URL:http://dotnet.mvps.org/>
    V B <URL:http://classicvb.org/petition/>

    Comment

    • Geoff Callaghan

      #3
      Re: New, dispose

      OK, great. How is setting it to 'nothing' different from disposing of it? Is
      there somewhere I can go for more info on VB Memory management?
      "Herfried K. Wagner [MVP]" <hirf-spam-me-here@gmx.at> wrote in message
      news:uRCy$Tz3FH A.3880@TK2MSFTN GP12.phx.gbl...[color=blue]
      > "Geoff Callaghan" <gcallaghan@tra keng.com> schrieb:[color=green]
      > >I have several functions that require doing a New on a local object. If[/color][/color]
      the[color=blue][color=green]
      > > object is local to a sub or function, do I need to dispose of it, or[/color][/color]
      will[color=blue][color=green]
      > > it just go away like any other local variable?[/color]
      >
      > This depends on the object, but in general it's a good idea to call the
      > object's 'Dispose' method. It's not necessary to set the variables to
      > 'Nothing' at the end of the method because the references will be deleted
      > automatically when execution exits the method.
      >
      > --
      > M S Herfried K. Wagner
      > M V P <URL:http://dotnet.mvps.org/>
      > V B <URL:http://classicvb.org/petition/>
      >[/color]


      Comment

      • Herfried K. Wagner [MVP]

        #4
        Re: New, dispose

        "Geoff Callaghan" <gcallaghan@tra keng.com> schrieb im Newsbeitrag
        news:uezwAiz3FH A.3136@TK2MSFTN GP09.phx.gbl...[color=blue]
        > OK, great. How is setting it to 'nothing' different from disposing of it?[/color]

        It is different (see below).
        [color=blue]
        > Is there somewhere I can go for more info on VB Memory management?[/color]

        ..NET Framework Developer's Guide -- Programming for Garbage Collection
        <URL:http://msdn.microsoft. com/library/en-us/cpguide/html/cpconprogrammin gessentialsforg arbagecollectio n.asp>

        --
        M S Herfried K. Wagner
        M V P <URL:http://dotnet.mvps.org/>
        V B <URL:http://classicvb.org/petition/>

        Comment

        • Cor Ligthert [MVP]

          #5
          Re: New, dispose

          Geoff,

          In general it is a bad idea to call dispose because it is there especially
          in a form or a component. The same as it is in general to call ToString.
          Dispose is standard implemented in componentbase which 20% of the classes
          are inheriting from.

          There are however classes that use unmanaged resources. That are not much.

          http://msdn.microsoft.com/library/de...classtopic.asp

          Have a look under the table in this page for the nicest description I have
          seen so far on MSDN. .

          It can as well be a good idea for memory consuming classes. The dispose
          gives a sign to the gc that it is ready to release. The dispose itself does
          not release anything. However to dispose every label or is really very much
          overdone. (Which is done by the implementation of the Idisposable in your
          form by the way, see that page for this and open than your form. That is the
          reason that I often use a component if I dont use a form where this is part
          of the code already in)

          I hope this helps,

          Cor


          Comment

          • Jay B. Harlow [MVP - Outlook]

            #6
            Re: New, dispose

            Geoff,
            In addition to the other comments, these are the rules I use to decide if I
            should call Dispose or not:

            When to call Dispose?

            * Call Dispose when the type itself implements IDisposable

            * Call Dispose when the type or one of its base classes *overrides*
            Dispose(Boolean ) if the class inherits from System.Componen tModel.Componen t
            or System.Componen tModel.MarshalB yValueComponent

            * Do not explicitly call Dispose on classes deriving from
            System.Windows. Forms.Control for instances placed on a
            System.Windows. Forms.Form as Form will implicitly dispose of them when the
            form is Disposed

            * Call Dispose on System.Windows. Forms.Form objects when Form.ShowDialog is
            used.

            * Do not explicitly call Dispose on System.Windows. Forms.Form objects if
            Form.Show is used as Dispose will be implicitly called when the form is
            closed

            * Do not explicitly call Dispose on classes deriving from
            System.Web.UI.C ontrol as it will be implicitly called as part of the normal
            ASP.NET page processing

            I consider the second rule controversial as it relies on using ILDASM or
            Reflector to find out implementation details of a class. Its meant for
            classes such as DataSet, that have an inherited Dispose, but Dispose doesn't
            really do anything.

            These rules are based on private discussions with other MVPs & discussions
            held in the newsgroups earlier in 2005.


            VB 2005 (.NET 2.0) introduces the Using statement that simplifies calling
            Dispose.

            ' VB 2005 syntax
            Using dialog As New OptionsDialog
            dialog.ShowDial og(Me)
            End Using

            ' VB 2002 & 2003 syntax
            Dim dialog As New OptionsDialog
            Try
            dialog.ShowDial og(Me)
            Finally
            ' assuming that dialog is not nothing...
            dialog.Dispose( )
            End Finally

            --
            Hope this helps
            Jay [MVP - Outlook]
            ..NET Application Architect, Enthusiast, & Evangelist
            T.S. Bradley - http://www.tsbradley.net


            "Geoff Callaghan" <gcallaghan@tra keng.com> wrote in message
            news:uor58Mz3FH A.3400@tk2msftn gp13.phx.gbl...
            |I have several functions that require doing a New on a local object. If the
            | object is local to a sub or function, do I need to dispose of it, or will
            | it just go away like any other local variable?
            |
            | Geoff Callaghan
            |
            |


            Comment

            • Jay B. Harlow [MVP - Outlook]

              #7
              Re: New, dispose

              Geoff,
              As Brian & my other post suggests.

              If you are using Form.ShowDialog , when you call Form.Close the form is
              simply hidden. You can then call Form.ShowDialog any number of times you
              want. Be certain to call Form.Dispose on the form variable when you are done
              with it.

              If you are using Form.Show, when you call Form.Close, Form.Dispose is
              automatically called for you. You cannot use Form.Show a second time without
              creating a new instance of the Form.

              --
              Hope this helps
              Jay [MVP - Outlook]
              ..NET Application Architect, Enthusiast, & Evangelist
              T.S. Bradley - http://www.tsbradley.net


              "Geoff Callaghan" <gcallaghan@tra keng.com> wrote in message
              news:Osz5Yp73FH A.1416@TK2MSFTN GP09.phx.gbl...
              | As usual, the answers to my questions indicate I'm not asking the right
              | questions. Let me be a bit more specific in the two cases that have me
              | worried;
              |
              | 1)I am using a sound player object (OPENNETCF). In order to make the code
              | work, I have a global PLAYER object which is assigned as a NEW PLAYER
              | every time it is used. I'm concerned that, since I'm doing a new and not a
              | dispose (there is no dispose method), I'm cluttering the memory with
              | "orphan" player objects.
              |
              | 2) The main purpose of my program is to show a set of screens. I have one
              | main screen that controls all the others. The others show in a
              | sequence...when one is finished, control returns to the main form, and the
              | main form then displays the next form in the sequence. I'm doing this
              using
              | SHOWDIALOG and CLOSE, rather than SHOW and HIDE, because when the new form
              | displays I want it to be in control. It's working fine. However, from what
              | I've read, every time I close the form, it disposes of the whole object.
              If
              | that's the case, how am I able to show it again without causing an error?
              Am
              | I creating a new form every time I do the SHOWDIALOG? It doesn't seem to
              be
              | doing that.
              |
              |
              | "Geoff Callaghan" <gcallaghan@tra keng.com> wrote in message
              | news:uor58Mz3FH A.3400@tk2msftn gp13.phx.gbl...
              | > I have several functions that require doing a New on a local object. If
              | the
              | > object is local to a sub or function, do I need to dispose of it, or
              will
              | > it just go away like any other local variable?
              | >
              | > Geoff Callaghan
              | >
              | >
              |
              |


              Comment

              • Cor Ligthert [MVP]

                #8
                Re: New, dispose

                Hi,

                In addition to Jay.

                What he write about the designer created form is the same for the designer
                created Component.

                Just a little addition what can be a reason to use that if you create a
                class from zero.

                Cor


                Comment

                • Jay B. Harlow [MVP - Outlook]

                  #9
                  Re: New, dispose

                  I should add that these rules apply to objects that you create, explicitly
                  or implicitly. Objects that you "own"

                  Disposable Objects that are passed to you as a parameter of a method (such
                  as the Graphics object on the Paint event) should not have their disposed
                  method call, as the system calls it as part of the method that raises the
                  event.

                  Objects that something else "owns" should normally be disposed of by the
                  "owning" object.

                  Thanks Cor, I need to add designed Components to my list.

                  --
                  Hope this helps
                  Jay [MVP - Outlook]
                  ..NET Application Architect, Enthusiast, & Evangelist
                  T.S. Bradley - http://www.tsbradley.net


                  "Jay B. Harlow [MVP - Outlook]" <Jay_Harlow_MVP @tsbradley.net> wrote in
                  message news:%236Xa9983 FHA.3460@TK2MSF TNGP12.phx.gbl. ..
                  | Geoff,
                  | In addition to the other comments, these are the rules I use to decide if
                  I
                  | should call Dispose or not:
                  |
                  | When to call Dispose?
                  |
                  | * Call Dispose when the type itself implements IDisposable
                  |
                  | * Call Dispose when the type or one of its base classes *overrides*
                  | Dispose(Boolean ) if the class inherits from
                  System.Componen tModel.Componen t
                  | or System.Componen tModel.MarshalB yValueComponent
                  |
                  | * Do not explicitly call Dispose on classes deriving from
                  | System.Windows. Forms.Control for instances placed on a
                  | System.Windows. Forms.Form as Form will implicitly dispose of them when the
                  | form is Disposed
                  |
                  | * Call Dispose on System.Windows. Forms.Form objects when Form.ShowDialog
                  is
                  | used.
                  |
                  | * Do not explicitly call Dispose on System.Windows. Forms.Form objects if
                  | Form.Show is used as Dispose will be implicitly called when the form is
                  | closed
                  |
                  | * Do not explicitly call Dispose on classes deriving from
                  | System.Web.UI.C ontrol as it will be implicitly called as part of the
                  normal
                  | ASP.NET page processing
                  |
                  | I consider the second rule controversial as it relies on using ILDASM or
                  | Reflector to find out implementation details of a class. Its meant for
                  | classes such as DataSet, that have an inherited Dispose, but Dispose
                  doesn't
                  | really do anything.
                  |
                  | These rules are based on private discussions with other MVPs & discussions
                  | held in the newsgroups earlier in 2005.
                  |
                  |
                  | VB 2005 (.NET 2.0) introduces the Using statement that simplifies calling
                  | Dispose.
                  |
                  | ' VB 2005 syntax
                  | Using dialog As New OptionsDialog
                  | dialog.ShowDial og(Me)
                  | End Using
                  |
                  | ' VB 2002 & 2003 syntax
                  | Dim dialog As New OptionsDialog
                  | Try
                  | dialog.ShowDial og(Me)
                  | Finally
                  | ' assuming that dialog is not nothing...
                  | dialog.Dispose( )
                  | End Finally
                  |
                  | --
                  | Hope this helps
                  | Jay [MVP - Outlook]
                  | .NET Application Architect, Enthusiast, & Evangelist
                  | T.S. Bradley - http://www.tsbradley.net
                  |
                  |
                  | "Geoff Callaghan" <gcallaghan@tra keng.com> wrote in message
                  | news:uor58Mz3FH A.3400@tk2msftn gp13.phx.gbl...
                  ||I have several functions that require doing a New on a local object. If
                  the
                  || object is local to a sub or function, do I need to dispose of it, or will
                  || it just go away like any other local variable?
                  ||
                  || Geoff Callaghan
                  ||
                  ||
                  |
                  |


                  Comment

                  • Geoff Callaghan

                    #10
                    Re: New, dispose

                    This has all been very helpful and informative; however, it seems that I
                    have been doing things properly all along. I am not using any custom
                    classes, everything I use is either from Visual Studio or OpenNETCF. Yet I'm
                    still getting out of memory exceptions after the program has been running
                    for awhile. If it isn't a garbage collection problem, where else could I
                    look?


                    "Geoff Callaghan" <gcallaghan@tra keng.com> wrote in message
                    news:uor58Mz3FH A.3400@tk2msftn gp13.phx.gbl...[color=blue]
                    > I have several functions that require doing a New on a local object. If[/color]
                    the[color=blue]
                    > object is local to a sub or function, do I need to dispose of it, or will
                    > it just go away like any other local variable?
                    >
                    > Geoff Callaghan
                    >
                    >[/color]


                    Comment

                    Working...