NewUnhandledException
NewUnhandledException

Reputation: 743

How do I properly dispose the byte array used in the class?

I have a StateObject class which is being used to store the data from client and server.

Here is the code:

 public class StateObject : IDisposable 
    {
        public StateObject()
        {

        }

        public String serviceName = ConfigurationManager.AppSettings["ServiceName"].ToString().Trim();  //Holds the service name 
        public Socket clientSocket; //socket for communication with the client

        public int id; //client id  (A running sequence to keep track of StateObjects)

        public string leaseId; //holds the leaseId that is used to communicate with the server

        public bool isLeaseIdValid = false;

        public string requestQuery = string.Empty;

        public IPEndPoint serverEP;

        public Socket serverSocket; //Socket for communication with the server

        public static int BUFFER_SIZE = Convert.ToInt32(ConfigurationManager.AppSettings["BufferSize"].ToString().Trim());  //Get the buffer size from the state object

        public byte[] clientReadBuffer = new byte[BUFFER_SIZE];   // Receive clientReadBuffer.
        public byte[] serverReadBuffer = new byte[BUFFER_SIZE];

        public int clientNumBytes;
        public byte[] clientSendBuffer = new byte[BUFFER_SIZE];
        public int serverNumBytes;
        public byte[] serverSendBuffer = new byte[BUFFER_SIZE];

        public bool isShutdown = false;

        public Socket serverSocketPort80; //Socket for communication with the server

        public bool ConnectedToPort80 = false; //initially set to false

        public ConnectionObject connectionObject;

        #region Dispose implementation

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                connectionObject.Dispose();
            }
        }

        ~StateObject()
        {
            Dispose(false);
        }

        #endregion
    }

How do I properly dispose this class and clearup the memory used by the byte array ? The byte arrays are being used to store sent/received messages in a socket communication.

Upvotes: 5

Views: 30803

Answers (2)

spender
spender

Reputation: 120518

You don't (as described in @DrewNoakes answer). If you identify this particular section of code as an object creation/memory allocation hotspot, consider creating a pool of byte arrays from which you can lease an already allocated array. Generally I try to do this with server software so there's some sort of upper bound on memory usage.

Upvotes: 5

Drew Noakes
Drew Noakes

Reputation: 311315

You only need to dispose unmanaged memory.

In this case it looks like the only thing you need to dispose is the Socket and possibly the ConnectionObject, whatever that is.

In other words, dispose any instances of IDisposable that this class creates.

The garbage collector will take care of the byte arrays once this object falls out of scope.

Upvotes: 13

Related Questions