この質問はさまざまな形式で尋ねられてきましたが、私の状況が完全に当てはまるかどうかはわかりません。
たとえば、node.js プログラムがあるとします。私のプログラムは、Stream というクラスをインスタンス化することにより、Stream に接続します。Stream 内で、StreamParser クラスがインスタンス化されます。これには、いくつかのタイマーが含まれます。
元の Stream の場合Stream.destroy()
、StreamParser を保持するオブジェクトは に設定されnull
ます。メモリ空間とタイマーはどうなりますか? 明示的にタイマーを実行している場合を除いて、タイマーがまだ実行されているようclearTimeout
です...
したがって、ネストされた構造:
new Stream()
-> this.stream = new StreamParser()
-> this.intv = setInterval(function() { // code }, 1000);
// Streams are destroyed like this:
Stream.destroy()
-> calls this.stream.destroy(function() {
self.stream = null;
// stream is null. but timers seem to be running. So, is stream still in memory?
}
私は少し混乱しています。もう少し拡張されたコード例:
// main call.
var stream = new Stream();
stream.connect();
setTimeout(function() {
stream.destroy(function() {
stream = null;
});
}, 60000);
/** ############# STREAM ############### **/
function Stream() {
this.stream = null;
this.end_callback = null;
}
Stream.prototype.connect = function() {
var self = this;
new StreamParser('stream.com', function(stream) {
self.stream = stream;
self.stream.on('destroy', function(resp) {
if(self.end_callback !== null && typeof self.end_callback === 'function') {
var fn = self.end_callback;
self.end_callback = null;
self.stream = null;
fn();
} else {
self.stream = null;
}
});
});
}
Stream.prototype.destroy = function(callback) {
this.end_callback = callback;
this.stream.destroy();
}
/** ############# STREAM PARSER ############### **/
function StreamParser(uri, callback) {
var self = this;
this.conn = null;
this.callback = null;
this.connectSocket(uri, function(conn) {
self.conn = conn;
self.callback(conn);
})
setInterval(function() {
self.checkHeartbeat();
}, 1000);
}
StreamParser.prototype.checkHeartbeat = function() {
// check if alive
}
StreamParser.prototype.destroy = function() {
this.conn.destroy();
this.emit('destroy', 'socket was destroyed');
}