与Java不同,Perl使用引用计数进行垃圾收集.我曾尝试搜索一些以前的问题,这些问题涉及C++ RAII和智能指针以及Java GC,但还没有理解Perl如何处理循环引用问题.
任何人都可以解释Perl的垃圾收集器如何处理循环引用?有没有办法回收程序不再使用的循环引用内存,或者Perl是否完全忽略了这个问题?
我有一个具有几种不同类型的内部循环链接的数据结构,从cycle命令的意义上讲它是无限的.是否有任何有趣的模块可以将这些结构折叠成使用索引的平面数据结构?
我感兴趣的序列化完整的数据结构,既通过Read和Show以及通过Data.Serialize或相似.
构建顺序索引显然有很好的功能,但基于内存地址哈希值的索引也可以正常工作.
我正在使用Automapper将我的NHibernate代理对象(DTO)映射到我的CSLA业务对象
我正在使用Fluent NHibernate来创建映射 - 这很好用
我Order遇到的问题是它有一个集合,OrderLines每个都有一个参考Order.
public class OrderMapping : ClassMap<OrderDTO>
{
public OrderMapping()
{
// Standard properties
Id(x => x.OrderId);
Map(x => x.OrderDate);
Map(x => x.Address);
HasMany<OrderLineDTO>(x => x.OrderLines).KeyColumn("OrderId").Inverse();
Table("`Order`");
}
}
public class OrderDTO
{
// Standard properties
public virtual int OrderId { get; set; }
public virtual DateTime OrderDate { get; set; }
public virtual string Address { get; set; }
// Child collection properties
public virtual IList<OrderLineDTO> OrderLines { get; …Run Code Online (Sandbox Code Playgroud) 假设我在同一个程序集中有以下类
public class ParentClass : IDisposable
{
public ChildClass Child
{
get { return _child; }
}
}
public class ChildClass
{
public ParentClass Parent
{
get { return _parent; }
set { _parent= value; }
}
public ChildClass (ParentClass parent)
{
Parent= parent;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但这是糟糕的设计.这会导致内存泄漏或其他一些不可预见的问题吗?显然垃圾收集器能够处理这种循环引用.
编辑
如果这两个类最终在其他类中被这样使用怎么办?
ParentClass objP = new ParentClass ();
ChildClass objC =new ChildClass(objP);
objP.Child = objC;
Run Code Online (Sandbox Code Playgroud)
想一想......
这是一个非常常见的问题,但我还没有找到我正在寻找的确切问题和答案.
我有一个表有一个FK指向它自己的PK的表,以启用任意深层次结构,就像经典的tblEmployee一样,它的列Manager是带有PK tblEmployee.EmployeeID的FK.
让我们在我的应用程序中说,用户
tblEmployee.ManagerNULL的这两个记录.tblEmployee.现在该表是循环引用而不是正确的树.
确保在应用程序中无法完成步骤3 的最佳方法是什么?我只需要确保它将拒绝执行最后一次SQL更新,而是显示一些错误消息.
我不是在挑剔它是SQL Server中的数据库约束(必须在2008年或2012年工作),还是在我的C#app的业务逻辑层中使用某种验证例程.
我有一个像这样的多级依赖图,我需要在这个图中检测任何循环引用.
A = B.
B = C.
C = [D,B]
D = [C,A]
有人有这样的问题吗?
有什么办法吗
谢谢,对不起英语.
=========更新==========
我有另一种情况.
1
2 = 1
3 = 2
4 = [2,3]
5 = 4
在这种情况下,我的递归代码在"4"引用中迭代两次,但是这个引用不会生成无限循环.我的问题是知道函数何时迭代多次引用并且不是无限循环,何时是无限循环,以通知用户.
1 = 4
2 = 1
3 = 2
4 = [2,3]
5 = 4
这种情况与第二个例子有点不同.这会产生无限循环.我怎么知道案件何时产生无限循环?
我正在构建一个对象数组.我需要这个数组只包含一个给定对象的实例,对同一个对象的多个引用应该抛出异常.我正在使用以下代码来实现此目的:
public function addField ($name, iface\Node $field)
{
// Prevent the same field being added multiple times
if (!in_array ($field, $this -> fields))
{
$this -> fields [$name] = $field;
$field -> setParent ($this);
}
else
{
throw new \InvalidArgumentException ('This field cannot be added to this group');
}
return ($this);
}
Run Code Online (Sandbox Code Playgroud)
当我开始实现实现Node接口的对象时,这开始导致问题,因为它们可以包含循环引用(它们包含其子节点的集合,每个子节点都包含对其父节点的引用).尝试添加字段可能会导致生成以下错误:
PHP致命错误:嵌套级别太深 - 递归依赖?
我怀疑PHP正试图遍历整个对象数组,而不仅仅是比较对象引用,看它们是否保持相同的值,因此指向同一个对象.
我需要in_array做的只是将它存储的对象引用与字段的对象引用进行比较.这将阻止它尝试遍历整个对象树并遇到递归问题.
有办法做到这一点吗?
我将我的实体框架实体从我的Web项目和数据访问层拆分为一个单独的类库.在我的控制器中,我调用我的存储库来获取IEnumerable<RobotDog.Entities.Movie>,然后尝试序列化为json使用JavaScriptSerializer但是我得到一个循环引用,即使我正在使用该[ScriptIgnore]属性.
重要提示:最初我在一个项目下拥有我的实体,数据访问和网络,我能够在没有循环引用的情况下成功序列化我的实体.当我创建单独的图层时,我开始遇到问题.我没有改变任何实体.
RobotDog.Entities命名空间中我的一个实体的示例:
namespace RobotDog.Entities {
public class Character {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(200)]
public string Name { get; set; }
public virtual Person Person { get; set; }
[ScriptIgnore]
public virtual Movie Movie { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器:
namespace RobotDog.Web.Controllers {
public class MoviesController : Controller {
private UnitOfWork _unitOfWork = new UnitOfWork();
[HttpGet]
public ActionResult Index() {
var user = Membership.GetUser(User.Identity.Name);
if(user …Run Code Online (Sandbox Code Playgroud) asp.net-mvc entity-framework circular-reference javascriptserializer
我从Dmitriy Pichugin 的现有答案中复制了下面的功能.此函数可以深度克隆对象而无需任何循环引用 - 它可以工作.
function deepClone( obj ) {
if( !obj || true == obj ) //this also handles boolean as true and false
return obj;
var objType = typeof( obj );
if( "number" == objType || "string" == objType ) // add your immutables here
return obj;
var result = Array.isArray( obj ) ? [] : !obj.constructor ? {} : new obj.constructor();
if( obj instanceof Map )
for( var key of obj.keys() )
result.set( key, deepClone( …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)
如果没有这个,我可以让我的程序工作,它只是方便.
c# ×3
.net ×1
arrays ×1
asp.net-mvc ×1
automapper-2 ×1
c ×1
clone ×1
csla ×1
haskell ×1
javascript ×1
node.js ×1
object ×1
perl ×1
php ×1
recursion ×1
sql ×1
sql-server ×1
struct ×1