下面的代码会产生内存泄漏吗?
根据jQuery文档使用该data函数可以避免内存泄漏.确认以下是否安全将是有用的.
var MyClass = function(el) {
// Store reference of element in object.
this.element = $(el);
};
// Store reference of object in element.
$('#something').data('obj', new MyClass('#something'));
Run Code Online (Sandbox Code Playgroud) 我正在制作一个游戏,而且我遇到了一个问题...当我尝试保存时,JSON失败并报告正在某处制作循环引用.我不认为它实际上是,我看不到它,所以是否有算法或任何可以告诉我它究竟在哪里(在哪些对象和东西之间)?另外,是否有可以保存循环引用的JSON替代方案?我正在运行一个node.js服务器,我看到了这个,但我无法让它工作(它不是作为一个模块,我可以在我的代码中需要()).
javascript json circular-reference serverside-javascript node.js
细节
首先,在我的情况下,"相等"的定义是 - 当对象具有相同的结构和该结构的值时,它们是相等的.但是,它们可能不是同一个实例,或者属性可能不在同一个"顺序"(我的意思是,因为它们被分配/定义).这里有类似的问题,就像这样 - 但它们并没有涵盖我的情况.
由于我的代码测试目的,我需要比较PHP中的实体 - 这些实体可能是任何东西.特别是,它们可能是物体.然而,对象比较并不"安全".想象一下,你正在比较:
$result = $objectX == $objectY;
Run Code Online (Sandbox Code Playgroud)
如果对象具有循环引用,这可能会导致致命错误.我在这里准备的简单例子.正如我们所看到的,PHP试图遵循嵌套级别并在无限循环中失败 - 因为自然对象在内容上是相同的,但具有循环引用.
重要的细节是对象可能包含不可序列化的东西(如闭包),这使得无法依赖"seralize/unserialize"方法(即使忘记了无序的比较)
目前的做法
我有这样的代码本(相当过分,直接粘贴在这里,但为了以防万一,这里是一个要点) -所以我表演DFS有接球这样的循环引用的情况.正如你所看到的,它非常复杂 - 顺便说一下,它很慢.
当前方法的另一个问题是 - 当对象内部有数组时,它们将在元素顺序方面进行比较,在某些情况下,这对我来说不合适(理想情况 - 当我能够切换顺序时 - 明智的比较),但为了克服它本身,我可能需要以某种方式"排序"数组 - 我不知道如何做到这一点 - 因为,再次,这些数组元素的比较将是不安全的.
而且,循环数组引用也会导致失败:
$array = ['foo', $object, &$array];
Run Code Online (Sandbox Code Playgroud)
题
什么是解决问题的其他(更好)方法?序列化对象可能就是这种情况,但由于非有序的属性集,它将失败.
我可以在C99这样做吗?
typedef struct dlNode {
dlNode* next,prev;
void* datum;
} dlNode;
const static dlNode head={
.next=&tail,
.prev=NULL,
.datum=NULL
};
const static dlNode tail={
.next=NULL,
.prev=&head,
.datum=NULL
};
Run Code Online (Sandbox Code Playgroud)
如果没有这个,我可以让我的程序工作,它只是方便.
根据主题,我在互联网上找不到任何与此相关的具体内容。
<ref *1>即使我将属性称为“树”,我在类名之前得到的输出中是什么?参考...什么,为什么如果我称之为财产?以及如何修复它?
CLI 输出:
> $ node binary-search-tree.js
<ref *1> BinarySearchTree { tree: [Circular *1] }
Run Code Online (Sandbox Code Playgroud)
这是我的代码(学习算法):
> $ node binary-search-tree.js
<ref *1> BinarySearchTree { tree: [Circular *1] }
Run Code Online (Sandbox Code Playgroud) 我已经阅读了为什么它更好以及它是如何实现的.但我真正理解的是它是如何打破循环引用的呢?.
它是如何打破参考圈的?
$(div1).data('item', div2);
$(div2).data('item', div1);
Run Code Online (Sandbox Code Playgroud)
例如,上面的div指向彼此,它是如何被阻止的?我有预感,但我只是想确定我的预感是否正确.
有没有办法在Symfony(而不是JMSSerializer)的序列化程序组件中使用任何配置或类似的东西设置循环引用限制?
我有一个带有FOSRestBundle的REST应用程序和一些包含其他应该序列化的实体的实体.但我遇到了循环引用错误.
我知道如何设置它:
$encoder = new JsonEncoder();
$normalizer = new ObjectNormalizer();
$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getName();
});
Run Code Online (Sandbox Code Playgroud)
但这必须在多个控制器中完成(对我来说是开销).我想在config(.yml)中全局设置它,例如:
framework:
serializer:
enabled: true
circular_limit: 5
Run Code Online (Sandbox Code Playgroud)
找不到序列化程序API参考,所以我想知道它是否可能?
为了更清楚地解释我的问题,我将首先解释我面临的现实案例.
我正在构建一个物理面板,上面有许多单词,可以有选择地点亮,以便编写句子.这是我的情况:
例:
SENTENCES:
"A dog is on the table"
"A cat is on the table"
SOLUTIONS:
"A dog cat is on the table"
"A cat dog is on the table"
Run Code Online (Sandbox Code Playgroud)
我尝试用"位置规则"来解决这个问题,在所有句子中使用的所有单词的集合中找到每个单词,单词应该在左边或右边.在上面的示例中,"on"单词的规则集将是"left(A,dog,cat,is)+ right(the,table)".
这种方法适用于琐碎的案例,但我的现实情况还有两个困难让我陷入困境,这与重复单词的需要有关:
我的问题是:
研究和解决这类问题的算法类别(甚至更好:具体的算法是什么)是什么?你能发布一些参考或代码示例吗?
编辑:复杂程度
从第一轮答案看,实际的复杂程度(即一个句子与另一个句子的差异程度)是一个重要因素.所以,这里有一些信息:
对于这个项目,我使用的是python,但任何合理可读的语言(例如:not notfuscated perl!)都没问题.
提前谢谢您的时间!
python language-agnostic sorting algorithm circular-reference
我知道sys.exc_info文档说在处理回溯对象时要小心,但我仍然不确定某些情况下的安全性或不安全性.此外,文档说"警告:不要这样做!",紧接着是"注意:实际上,它确定",这进一步让我感到困惑.
在任何情况下,文档和" 为什么需要在Python中显式删除sys.exc_info()回溯? "(Alex Martelli的回答),似乎暗示它唯一的局部变量引用分配给它们的追溯值,一个问题.
这给我留下了一些问题:
随意告诉我我的结论或假设在哪里是错误的,因为我已经多次因为我已经写了这个问题而将自己的信念和不相信我自己的陈述推理出来了:).
虽然我想要回答我的具体例子,但我也要求提供关于如何在更深奥的情况下安全地处理追溯的一般建议,知识或战争故事(例如,你必须运行循环并想要累积任何引发异常,你必须生成一个新线程,并且需要报告任何引发的异常,你必须创建闭包和回调,并且必须回复引发的异常等.
示例1:执行错误处理的内部函数
def DoWebRequest():
thread, error_queue = CreateThread(ErrorRaisingFunc)
thread.start()
thread.join()
if not error_queue.empty():
# Purposefully not calling error_queue.get() for illustrative purposes
print 'error!'
def CreateThread(func):
error_queue = Queue.Queue()
def Handled():
try:
func()
except Exception:
error_queue.put(sys.exc_info())
thread = threading.Thread(target=Handled)
return thread, error_queue
Run Code Online (Sandbox Code Playgroud)
Handled()闭包是否导致引发任何引发的异常error_queue并导致循环引用,因为error_queue还包含回溯?从error_queue(即调用.get())中移除回溯足以消除循环引用?
示例2:exc_info范围内的长生命对象,或返回exc_info
long_lived_cache = {}
def Alpha(key):
expensive_object = long_lived_cache.get(key)
if not expensive_object:
expensive_object = ComputeExpensiveObject()
long_lived_cache[key] = expensive_object …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个验证某个类型实例的属性.
为了做到这一点,我必须将其ObjectInstance转换为该类型.
我需要在该类型的成员上设置属性.
所以我们需要求助于and循环定义的关键字.
但是在下面的例子中我得到了错误
自定义属性必须调用对象构造函数
在下面标出的行上.
namespace Test
open System
open System.ComponentModel.DataAnnotations
[<AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)>]
type MyAttribute() =
class
inherit ValidationAttribute ()
override this.IsValid (value: Object, validationContext: ValidationContext) =
match validationContext.ObjectInstance with
| :? MyClass as item ->
// TODO more validation
ValidationResult.Success
| _ ->
new ValidationResult("No no no")
end
and MyClass(someValue) =
[<Required>]
[<Range(1, 7)>]
//vvvvvvvvvvvvvvv
[<MyAttribute>]
//^^^^^^^^^^^^^^^
member this.SomeValue : int = someValue
Run Code Online (Sandbox Code Playgroud)
我试着手动调用构造函数,例如:
[<MyAttribute()>]
// or
[<new …Run Code Online (Sandbox Code Playgroud)