Przy wpisywaniu liczb do tablicy za każdym razem alokujesz dla niej pamięć na nowo.
tablica = new int [licznik];
Po czym wsadzasz do niej 1 liczbę na indeksie pozycji licznik. Poprzednie miejsca przed licznikiem są wypełnione śmieciami z pamięci.
while(cin >> liczba)
{
//robisz kopie tablicy
int* tablica_kopia = nullptr;
if(tablica) {
tablica_kopia = new int[tablica_size]; //alokujesz pamięć dla kopii i wypełniasz ją danymi
delete [] tablica; //czyścisz główną tablicę
tablica = nullptr;
}
tablica_size++;
tablica = new int[tablica_size];
//kopiujesz liczby z tablica_kopia do tablica i na ostatniej pozycji wstawiasz wpisaną liczbę
delete [] tablica_kopia;
}
W bibliotece <numeric> masz funkcję sumującą podany zakres
int suma = accumulate(tablica, tablica+tablica_size, 0);
I pamiętaj, zawsze gdy alokujesz pamięc przy pomocy new musisz ją zwolnić za pomocą delete!