En .Net ¿no existe el TList y TObjectList?
Esas 2 clases ya incorporan lo que estas haciendo, te puede ser más libiano.
De todas formas, intentando ayudar sin tener demasiada experiencia en C.
Quizás el problema esté aquí:
Código Delphi
[-]
public cosa Get(int index)
Creo que ahí estás devolviendo un puntero, por ello te modifica el original.
La primera línea no la entiendo, parece que clonas el array, pero lo que deberías clonar sería el "cosa"
Por cierto, la clase cosa, más abstracta no puede ser, ¿no había otro nombre para darle?
Saludos