`
换个号韩国红果果
  • 浏览: 45962 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

js delete 删除机理以及它的内存泄露问题的解决方案

    博客分类:
  • web
阅读更多
delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露  (其实还未删除)
举例:
var person={name:{firstname:'bob'}}
var p=person.name
delete person.name
p.firstname  -->'bob'
// 依然可以访问p.firstname,存在内存泄露!!
 

解决方法,用递归!!
//为何不刚开始就将deleteprop设为递归函数??因为它只有一个值,而若它是对象则内层属性可能存在多个,递归的条件是1. 子问题须与原始问题为同样的事,且更为简单:2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
不满足第一条,故必须在内层设置deleteDeep为递归函数!!
function  deleteprop(prop){
	//var current=obj;
	if(typeof prop ==='object')
		deleteDeep(prop)
	
	else
		delete prop;
	function  deleteDeep(current){// 递归函数,循环属性值,对于每一个值,若依然为对象则进行递归
		for(var i in current){
			if(typeof current[i] ==='object')
				deleteDeep(current[i])//或者用  arguments.callee(current[i])
			else
				delete current[i];//expert出口
		}
	}
	
}

举例:
person={name:{
first:'bob',
last:'amy',
relative:{
           mother:'amy',
           father:'peter'}
              }
         }

var p=person.name.relative;//注意:对象拷贝是引用不是拷贝
p  -->{
           mother:'amy',
           father:'peter'}
              }
deleteprop(person.name)

p-->{}//说明已删除!!
由此解决了delete的内存泄露问题
分享到:
评论

相关推荐

    几个内存泄漏的例子

    几个内存泄漏的例子  new和delete要成对使用...经常看到一些C++方面的书籍中这样提及到内存泄漏问题,这样的说法的意思是比较明白,但对于初学C++程序员还是很难掌握,所以下面举几个反面的例子,希望对大家有帮助。

    MySQL DELETE 删除语句加锁分析1

    1.前言在MySQL的使用过程中,对SQL加锁的类型经常感到疑惑,这让死锁分析也变得举步维艰。因此需要将MySQL的各种SQL在各个隔离级别下加的锁进行分析,以

    source_delete_new.rar_hook delete_内存泄露_重载new

    解决内存泄露的源代码,重载了NEW DELETE 函数,通过获取指针的钩子,截获内存泄露的元凶

    Linux-operator-new-delete.rar_Operator Down_VC debug技巧_内存泄漏

    在 windows 下使用 VC 编程时,我们通常需要 DEBUG 模式下运行程序,而后调试器将在退出程序时,打印出程序运行过程中在堆上分配而没有释放的内存信息,其中包括代码文件名、行号以及内存大小。该功能是 MFC ...

    用new和delete运算符动态分配内存空间的方法编写程序。

    用new和delete运算符动态分配内存空间的方法编写程序。从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。

    MFC中解决子线程中打开非模态对话框内存泄漏实例(VC++2008)

    子线程中打开非模式对话框内存泄漏问题 这个问题困扰已久 网上没有完整的解决方案;现将实例源代码分享给大家 希望对您有帮助 (代码是VS2008下编写的) 问题原因: 对话框的默认关闭方式模式对话框关闭 而现在是...

    linux下检测内存泄漏

    在 windows 下使用 VC 编程时,我们通常需要 DEBUG 模式下运行程序,而后调试器将在退出程序时,打印出程序运行过程中在堆上分配而没有释放的内存信息,其中包括代码文件名、行号以及内存大小。该功能是 MFC ...

    动态内存分配操作符new和delete

    动态内存分配操作符new和delete,以及new[]和delete[]

    Yii使用DeleteAll连表删除出现报错问题的解决方法

    本文实例讲述了Yii使用DeleteAll连表删除出现报错问题的解决方法。分享给大家供大家参考,具体如下: 删除数据的时候,经常会遇到连联判断删除数据的条件,今天用Yii 的CDbCriteria生成关连条件。批量删除的时候...

    内存泄漏检查类

    C++内存泄漏检查源码,通过重载全局new/delete new[]/delete[]实现,多线程安全。

    新版MQL语言编程-检测内存泄露-快速找到内存泄露的行号和文件名

    1.今天笔者告诉大家一种方法可以非常容易地监督delete运算符的追踪问题。 2.当程序出现内存泄露时,可以快速定位到是哪个文件哪行出现问题,如果代码在几万行以上,这点非常重要。 3.由于MT4与MT5编译器不具备查找...

    mysql delete 多表连接删除功能

    单个表的删除: DELETE FROM tableName WHERE columnName = value; 删除表内的所有行: 即:保留表的结构、属性、索引 DELETE FROM tablename; DELETE * FROM tablename; 删除同一张表内的所有内容(删除数据、表...

    如何在linux操作系统下检测内存泄漏

    在 linux 或者 unix 下,C++ 程序缺乏相应的手段来检测内存信息,而只能...本文将简述 C++ 中的 new 和 delete 的基本原理,并讲述了内存检测子系统的实现原理、实现中的技巧,并对内存泄漏检测的高级话题进行了讨论。

    js删除数组中的元素delete和splice的区别详解

    方法一:delete 删除数组 delete textArr[1] 结果为: [“a”,undefined,”c”,”d”]  只是被删除的元素变成了 undefined 其他的元素的键值还是不变。 方法二:aplice 删除数组 splice(index,len,[item])  注释...

    js delete 用法(删除对象属性及变量)

    1,对象属性删除 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delete obj.name; console.log(obj.name); //undefined 2,变量删除 var name = 'lily'; delete name; ...

    浅谈CC++内存泄漏及其检测工具

    Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然...

    C++内存管理详解,new,delete的合理使用

    对应的new和delete要采用相同的形式 下面的语句有什么错? string *stringarray = new string[100]; ... delete stringarray; 一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的...

    rsync备份海量文件时占用大量内存的解决方法

    备份的时候,rsync扫描到的每个文件(目录也一样),在它的列表中约占100字节的内存,如果加了–delete参数的话,占用的内存会更多。 例如我这里一台服务器,约800万的图片,而且更新比较频繁,文件数增长比较快,...

    恢复软件 可以恢复SHIFT+DELETE删除的文件

    强力恢复被删除的文件,可以恢复SHIFT+DELETE删除的文件。

    C语言 - 删除数组中的指定元素(Delete).pdf

    C语言 - 删除数组中的指定元素(Delete).pdf C语言 - 删除数组中的指定元素(Delete).pdf C语言 - 删除数组中的指定元素(Delete).pdf C语言 - 删除数组中的指定元素(Delete).pdf C语言 - 删除数组中的指定元素...

Global site tag (gtag.js) - Google Analytics