返答遅れてすみません;;
h2so5 さんが書きました:質問している内容と添付しているコードの内容が一致していません。
要素を削除しているコードではなく、追加しているコードを貼るべきでしょう。
追加しているコードは少し深いところにあるので、ちょっと見づらいかもしれませんが
※敵オブジェクトの場合
コード:  
//	メイン	================================================================================================================================
bool C_ZakoObj::Obj_Main(){
	(this->*MovePattern)();		//	行動関数ポインタ
	MoveAdd();					//	移動
	//	回転するタイプ
	if( m_RotaAdd )	m_RotaAngle		+= m_RotaAdd;
	AnimeAct();
	//	敵が画面から外れたら消す
	if( GetDelLineArea( 1 ) && CheckLimitCountOver() ){
		m_Flag	= false;
	}
	EnemyDelete();									//	Lifeが0なら大破
	m_MutekiTime	-= m_MutekiTime == 0 ? 0 : 1;	//	無敵時間を減らす
	m_FlameCount	++;								//	毎フレームカウント
	return	m_Flag;
}
MovePattern内で敵弾オブジェクトや、エフェクトオブジェクトが生成されます。
MovePatternは行動パターンの関数をいれます。
行動パターン関数
コード:  
void C_ZakoObj::MovePattern001(){
	if( Judge( 80, 120, 10 ) ){
		Bullet->nway( m_X, m_Y, 1, GetAngleToPlayer(), 0, 4.0, e_BULLET_DAEN, m_Element );
	}
}
Bullet->nwayでオブジェクトが追加されます。
内部でNewObjEntryが呼ばれます。
h2so5 さんが書きました:他の方法として、要素追加後の要素数に見当がつく場合、
追加前にreserveすることでイテレータの破壊を防止することができます。
reserveという手がありましたか、参考にさせていただきます。
YuO さんが書きました:
例えば確認処理がbool virtual C_ObjProcess::hasObject() const = 0;だとして,
コード:  
m_ObjPt.erase(std::remove_if(m_ObjPt.begin(), m_ObjPt.end(), std::not1(std::mem_fn(&C_ObjProcess::hasObject))), m_ObjPt.end());
と,削除自体は一行になります。
もちろん,このままではメモリリークが発生するため,std::shared_ptrを使うのでしょうが,
std::shared_ptr使うとnot1とmem_fnの組み合わせがそのままでは使えなくなるので,ラムダ式を使って,
コード:  
m_ObjPt.erase(std::remove_if(m_ObjPt.begin(), m_ObjPt.end(), [] (const std::shared_ptr<C_ObjProcess> & p) { return !p->hasObject(); }), m_ObjPt.end());
のようになりますが。
 
高度すぎて理解できませんでした///
参考にする前に解読したいと思いますw