cocos2d-x关于addchild的问题,求大大帮忙。。。

今天我在看龙灵修老师的cocos2d-x手游开发实战练习,别踩白块儿的视频。

(抱歉我没有权限发URL链接。。。)

在视频的后面我遇到了一个难题。PS:我用的时win7 32bit VS2012写的Cocos
auto normal_label = LabelTTF::create(normalTTF,"Marker Felt.ttf",40);addChild(normal_label);
addChild(normal_label);

简而言之,龙老师新建了一个标签。

auto normal_button = MenuItemLabel::create(normal_label);

然后给这个标签添加了一个MenuItem。

然后问题出现了,我也像他这么写的,程序编译通过,但是运行的时候崩溃了,抛出异常:child->_parent == nullptr。

我访遍各大论坛,问答网站,从百度知道到csdn,从知乎到cocoChina,最后去了Stack overflow。

只看到有人提出这个问题,但是并没有解答。

然后我做了实验:

addChild(normal_label);

auto normal_button = MenuItemLabel::create(normal_label);

这两句话不能同时共存,否则程序崩溃。

研究了半天,到晚上都没有结果。

下面是我的测试结果,供大家参考一下,帮我解决这个问题:

normal_label的内存地址 :0*07dbb440。

我用单步调试,进入了

addChild函数
两次F11之后到了这里
CCASSERT(child != nullptr, "Argument must be non-nil");
CCASSERT(child->_parent == nullptr, "child already added. It can't be added again");
(这里就是抛出异常的地方,其实我很纳闷,为什么抛出的异常是child->_parent == nullptr,而不是child already added. It can't be added again)
因为第一次嘛,断言通过,继续深入,开始实现addChild操作。
在添加孩子之后,执行了一个void Node::setParent(Node * parent)函数
_parent = parent;

然后我直接跳出了addchild函数
这是显示:
normal_label->_parent的内存地址 :0*07b49270。

然后我F11进入了
auto normal_button = MenuItemLabel::create(normal_label);
在create函数里面经过n次跳转之后,我竟然发现,函数进了addChild()函数,也就是说create底层调用了addchild函数,
当然结果和上面一样,

不过这一次程序死在了断言
CCASSERT(child != nullptr, "Argument must be non-nil");
CCASSERT(child->_parent == nullptr, "child already added. It can't be added again");
直接抛出了异常,

随后我又将
auto normal_button = MenuItemLabel::create(normal_label);
addChild(normal_label);
调转了顺序,可是结果一样,但是这两句话只有注释掉了一句就行了。

简而言之,这个程序调用了两次 addChild(normal_label);
第二次就会报错。

然而我并不知道怎么解决,为什么龙灵修老师的视频里面就没有报错,到我这里就出错了。
求各位大大帮我看看。。。。。。。。。。。。。。。图片说明

addChild(normal_label);

auto normal_button = MenuItemLabel::create(normal_label);
这里相当调用了相次addChild,normal_label只能用一次,所以当然会出错,方法就是clone一个就来操作
另外,所有的动作也是一样,只能给一个精灵用!其它想用就得clone.这是Cocos2dx自已的内存管理机制。

所有的子类,只能addChild一次