[Cocos2dx]面试题汇总二

11、判断单链表中是否存在环

#include "stdafx.h"
typedef char eleType;    // 定义链表中的数据类型
typedef struct listnode  {   // 定义单链表结构
	eleType data;
	struct listnode *next;
}node;
node *create(int n) {    // 创建单链表,n为节点个数
	node *p = (node *)malloc(sizeof(node));
	node *head = p;  head->data = 'A';
	for(int i='B'; i<'A'+n; i++) {
		p = (p->next = (node *)malloc(sizeof(node)));
		p->data = i;
		p->next = NULL;
 	}
	return head;
}
void addCircle(node *head, int n) { // 增加环,将链尾指向链中第n个节点
 	node *q, *p = head;
 	for(int i=1; p->next; i++) {
  		if(i==n) q = p;
 		p = p->next;
 	}
 	p->next = q;
}
int isCircle(node *head) {   // 这是笔试时需要写的最主要函数,其他函数可以不写
	node *p=head,*q=head;
 	while( p->next && q->next) {
  		p = p->next;
  		if (NULL == (q=q->next->next)) return 0;
  		if (p == q) return 1;
	}
 	return 0;
}
int main(int argc, char* argv[]) {
 	node *head = create(12);
 	addCircle(head, 8);   // 注释掉此行,连表就没有环了
 	printf("%d\n", isCircle(head));
}


2、cocos2d-x内管管理

  目前主要有两种实现智能管理内存的技术,一种是引用计数,一种是垃圾回收。Cocos2d-x采用的是引用计数机制。为此实现了自己的根类Ref,每个对象都包含了一个用来控制生命周期的引用计数器,就是Ref的成员变量m_uReference。

  对于m_uReference,构造函数创建时对该引用计数器赋值为1(自引用,并没有实际的使用),当需要引用对象时调用retain()方法增1,当引用结束的时候调用release()方法减一。而autorelease()方法(create工厂方法迫切需要)会将对象放入自动回收池(AutoReleasePool)实现灵活的垃圾回收。当每一帧结束的时候,自动回收池中的对象都会被执行一次release() 

autorelease()方法里面代码将该对象添加到自动释放池中:PoolManager::sharedPoolManager()->addObject(this); 

 create方法将对象加入内存池后,对象的所有权已经属于内存池了, 我们返回的指针其实是没有所有权的.  主循环mainloop干了件非常重要的事情, 那就是pop最上层的autoreleasepool, 此时是在release全部仅仅由此内存池所有的对象.就是依靠这样的原理, 我们可以放心的将对象放在autoreleasepool中, 知道在需要的时候, 这个对象就能正确的释放, 同时只要有上层的父节点通过addChild对游戏对象有了所有权以后, 又能正确的保证该对象不会被删除.

如果在一帧之内生成了大量的autorelease对象,将会导致回收池性能下降。因此,在生成autorelease对象密集的区域(通常循环中)的前后,我们最好可以手动创建并释放一个回收池。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值