Yep, that is the idea. To avoid the situation you mentioned, you just have to set the limit to a number that is slightly higher than roughly half of the maximum amount of projectiles that can be on screen, but is reasonable enough so that it doesn't eat up a lot of memory. For my RPG, there are never more than 50-70 projectiles on the screen at one time, so I set the arbitray limit for each list to 50 to make sure there will never be projectiles that suddenly vanish. This also makes sure that there will only be a maximum of 100 projectiles in memory at any given time.
I'll send the source now.
EDIT: I'll just post it here.
bool Game::AddNewSpell(CPoint* p,int x,int y,int typ,int flag){ CUtil u; bool valid; if(SpellArrayKey==1) //If First List is Active { if(CurrentSpellSlot<=50) //If Capacity has not been reached { valid=Spells1[CurrentSpellSlot].SetSpell(typ,x,y,p,flag); //Addition Successful CurrentSpellSlot++; } else //Capacity has been reached { Spells2.DecrementDimen(50); //Empty the Second List Spells2.IncrementDimen(50); //Re-establish Maximum Allocation for Second List for(int az=1;az<=50;az++) Spells2[az].SetGamePointer(this); //Re-establish Game pointers SpellArrayKey=2; //Second List is now Active CurrentSpellSlot=1; //One Spell in Second List valid=Spells2[CurrentSpellSlot].SetSpell(typ,x,y,p,flag); //Addition Successful CurrentSpellSlot++; } } else if(SpellArrayKey==2) //If Second List is Active { if(CurrentSpellSlot<=50) //If Capacity has not been reached { valid=Spells2[CurrentSpellSlot].SetSpell(typ,x,y,p,flag); //Addition Successful CurrentSpellSlot++; } else //Capacity has been reached { Spells1.DecrementDimen(50); //Empty the First list Spells1.IncrementDimen(50); //Re-establish Maximum Allocation for First list for(int azl=1;azl<=50;azl++) Spells1[azl].SetGamePointer(this); //Re-establish Game Pointers SpellArrayKey=1; //First List is now Active CurrentSpellSlot=1; //One Spell in First List valid=Spells1[CurrentSpellSlot].SetSpell(typ,x,y,p,flag); //Addition Successful CurrentSpellSlot++; } } else u.ProcessTerminalError("Game::AddSpell-Invalid SpellArrayKey!!"); //Error catch return valid;}