精通Cocos2d-x游戏开发(基础卷)
上QQ阅读APP看书,第一时间看更新

3.6 普通对象和new出来的对象

如果读者刚接触C++,那么很可能分不清楚普通对象和new出来的对象有什么不一样,在写代码的时候,会看到如图3-1所示对话框。

图3-1 程序崩溃

当把一个Sprite添加到场景中时,弹出了图3-1所示对话框,仔细看一下代码,没错,要传入一个指针,这里确实传了一个指针进去,由于指针使用不当而引起的BUG太多太多了!对于下面这种情况,sp是在栈空间分配的,当这个函数执行完成返回的时候,就被释放了,而new出来的对象是在堆空间分配的,只有当手动删掉的时候才会释放,而在栈空间分配的对象不能使用delete操作符来释放。在Cocos2d-x中,应该遵循Cocos2d-x的内存管理规则,使用release方法来释放Cocos2d-x的对象,而不是使用delete操作符。

Sprite sp;
sp.initWithFile("HelloWorld.png");
this->addChild(&sp);

这个问题在3.0之后就不会再遇到了,上面的代码会变成一个编译错误,因为Sprite只能使用create方式来创建,不能new也不能定义为普通的局部变量,但如果创建的是一个子类,那么还是会出现这个错误的。