Cocos2d-x、Create_func和init方法,立即调用析构函数
Cocos2d-x, Create_func and init method, immediately call destructor
我习惯于使用Objective-C和Cocos2d,所以这里有一些让我困惑的地方
我确实想把一些自定义对象保存到一个二维数组中,所以我这样做,在我想要数组的类的头中:
public:
SomeClass *matrix[6][6];
在.cpp的init方法中,我做了:
this->matrix[0][0] = SomeClass::create();
如果我这样做,构造函数、init和析构函数将按以下顺序调用。。。显然,让我困惑的是析构函数调用。
如果我这样做:
this->matrix[0][0] = new SomeClass;
SomeClass是CCNode的一个子层。
构造函数被调用,这很好。。。但既然我确实想在create中使用init方法,我该怎么做呢?我不知道为什么使用create方法,当方法返回时,它会立即调用析构函数。
我真的不明白init方法和Create_func是怎么回事,因为我是Cocos2d-x的新手,所以我想更好地理解这一点。
这是我正在使用的创建函数:
#define CREATE_FUNC(__TYPE__)
static __TYPE__* create()
{
__TYPE__ *pRet = new __TYPE__();
if (pRet && pRet->init())
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
}
}
首先,让我解释一下cocos2d-x内存管理是如何工作的。
由于cocos2d-x与cocos2d相关,因此cocos2d-x团队愿意使用像在object-c中那样的保留/释放内容。
显然,只有当CCObject的保留值大于0时,它才会被保存在内存中。
一旦调用函数release((;,该对象的保留值将减去1,如果达到0,则将调用析构函数。
最后是autorelase((函数。它是什么,对于cocos2d-x,核心线程在CCPoolManager::sharedPoolManager((中持有一个CCArray。在每一帧中,该数组中的所有对象都将调用release((一次,如果保留值==0,则将被移除。
既然如此,我们还是来吧。
我相信autorelease((是让你感到困惑的原因。当对象由new ClassName((创建时,retain==1;但如果它被称为autorelease((,它仍然保持为1,但在下一帧中将为0。
这就是为什么当你使用这个->矩阵[0][0]=SomeClass::create((;构造函数、init和析构函数将被逐一调用,但请记住,析构函数是在init((之后的下一帧中调用的。
因此,如何纠正这些错误,有很多方法可以做到。最简单的方法是:this->matrix[0][0]=SomeClass::create((;this->matrix[0][0]->retain((;
除此之外,我强烈建议使用CC_SYNTHESIZE_RETAIN(varType,varName,funName(来定义值,而不是在headder文件中使用ClassName*valueName。
并使用set##funName(varType-var(来设置它,而不是使用valueName=ClassName::create((。
有关更多信息,您可以阅读CC_SYNTHESIZE_RETAIN marco。
只需使用retain((。。
SomeClass *newObject=SomeClass::create();
newObject->retain();
this->matrix[0][0] = newObject;
然后您需要稍后手动释放对象,然后再删除此数组,否则可能会发生内存泄漏。
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常