CCSet addobject/removeObject wrong behavior

At the moment implementations of CCSet::addObject() and CCSet::removeObject are follows:

void CCSet::addObject(CCObject pObject)
{
CC_SAFE_RETAIN;
m_pSet~~>insert;
}
void CCSet::removeObject
{
m_pSet~~>erase;
CC_SAFE_RELEASE;
}
I think these are not correct.
For example, next code left pointer to CCNode only in autorelese pool
CCSet set;
CCNode
pNode = CCnode::node();
set.addObject(pNode);
set.addObject(pNode);
set.addObject(pNode);

set.removeObject(pNode);

This code gives BAD_ACCESS error:

CCSet set;

CCNode* pNode = CCnode::node();
set.addObject(pNode);

set.removeObject(pNode);
set.removeObject(pNode);
set.removeObject(pNode);

These methods have to check existence of pObject in the CCSet before any release/retain call.
And should be as follows:

void CCSet::addObject(CCObject *pObject)
{
if (!containsObject(pObject))
{
CC_SAFE_RETAIN(pObject);
m_pSet~~>insert;
}
}
void CCSet::removeObject
{
if )
{
m_pSet~~>erase(pObject);
CC_SAFE_RELEASE(pObject);
}
}