0

I am using Node.js. I have an array of objects.

var my_array = [];
var param_array = [xx, xx, ...];

for (i = 0; i < 5; i++) {
    my_array[i] = new ClassName(param[i]);

    (my_array[i]).on('event_name', function() {
        // do something
    });
}

All the objects are created from a class/library. All the objects have event listener.

After finished using the objects in the array, I want to delete all the objects and free up memory.

Based on Google search results, the Garbage Collector should automatically free up memory when the memory is not referenced by any variable anymore. So, I set the array to a new empty array:

my_array = [];

However, I was surprised to find that all the event listeners of the objects in the old array are still responding to events.

How can I delete (or dereference) all the objects which have event listener and free up memory?

1 Answer 1

2

You are only clearing your array. There may be a bug in your code, can't tell from the code you posted. To be sure, you should iterate over your my_arrays objects and call

removeListener (‘event_name’, eventListener)

for each, then clear my_array using my_array = []. In that way, the Garbage Collector will take care of those, as there will be no reference. First argument is event name, second an eventListener you want to delete.

Also, in your case, you should use

removeAllListeners(‘event_name’)

as it doesn't need eventListener function name and you don't need those objects anymore later.

SSCCE:

//creating an EventEmitter object just to illustrate how it works
var events = require('events');

function ExampleObject() {
  events.EventEmitter.call(this);

  this.talk = function()
  {
      this.emit('event_name');
  }
}

ExampleObject.prototype.__proto__ = events.EventEmitter.prototype;

var exampleObject = new ExampleObject();

exampleObject.on('event_name', function() {
    console.log('Here I go!');
  });

exampleObject.talk();
//---------
my_array = [];

var listener = function listener()
{
  console.log('event_name_listener');
}


for(i = 0; i < 5; i++)
{
    my_array[i] = new events.EventEmitter();
    my_array[i].on('event_name', listener);
}

for(i = 0; i < my_array.length; i++)
{
    my_array[i].emit('event_name');
    console.log(i);
}

for(i = 0; i < my_array.length; i++)
{
    my_array[i].removeAllListeners('event_name'); //could use removeListener('event_name', listener)
}

my_array = [];
console.log("Array length:"+my_array.length);


//------------- and here our ExampleObject
exampleObject.talk();
console.log("Listeners: "+require('util').inspect(exampleObject.listeners('event_name')));

console.log(exampleObject);//more info

exampleObject.removeAllListeners('event_name');
exampleObject.talk();//nothing happens

console.log("Listeners: "+require('util').inspect(exampleObject.listeners('event_name')));

delete exampleObject;
console.log(exampleObject);

Output:

Here I go!
event_name_listener
0
event_name_listener
1
event_name_listener
2
event_name_listener
3
event_name_listener
4
Array length:0
Here I go!
Listeners: [ [Function] ]
ExampleObject {
  domain: null,
  _events: { event_name: [Function] },
  _eventsCount: 1,
  _maxListeners: undefined,
  talk: [Function] }
Listeners: []
ExampleObject {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  talk: [Function] }

At the end, all eventListeners are deleted.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.