Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Problem z powiększaniem tablicy dynamicznej


Rekomendowane odpowiedzi

Opublikowano
void add(int element){
        int newArrayElements = listElements-1;
        int *newArray = new int[newArrayElements];
        for(int i = 0; i<listElements;i++){
            newArray[i] = List[i];
        }
        delete[] List;
        List = newArray;
        List[newArrayElements] = element;
        delete[] newArray;
    }

int *List = new int[listElements]; - w konstruktorze podaje się liczbe elementów.

Funkcja ma za zadanie :

Zwiększyć liczbe tablicy o 1 oraz dodać element podany jako argument funkcji

 

Błąd to

errJPG_epspnew.JPG

Opublikowano

jak zmniejszasz wielkość tablicy o jeden to
newArray = List;
odwołuje się do jednego elementu za nowa tablicą newArray

dodatkowo w linii
List[newArrayElements] = element;
odnosisz się zawsze do jednego elementu poza tablicę List niezależnie od jej rozmiaru, bo jej zakres wynosi [0, newArrayElements)

może to ci pomoże

http://www.frogatto.com/?p=26
Opublikowano

up@

Ćwicze sobie wskaźniki ;)

topic@

Normalnie działa. Wystarczyło usunąc zwalnianie pamięci (delete[]) ale wycieki pamięci po tym będą. Jak temu zaradizć?

Opublikowano

jeszcze poprawiam, przepraszam za pomyłkę.

delete[] powinno być zamiast delete (pisałem na odwrót)

delete wywołuje destruktor tylko na jednym obiekcie, a delete[] na wszystkich.

czyli tak jak robiłeś

po new[] usuwasz za pomocą delete[]

po new usuwasz za pomocą delete

i jeszcze raz przepraszam za wprowadzenie w błąd

Opublikowano

Absolutnie w ogóle nie powinno być tam żadnego delete newArray; ani delete[] newArray;

 

 

newArray to wskaźnik tworzony w ciele funkcji

int *newArray

 

Więc po wykonaniu funkcji zostanie usunięty i żadnych "wycieków pamięci nie będzie".

 

Korzystasz z operatora delete wyłącznie by zwolnić pamięć zajętą operatorem 'new'

 

Ten kod powinien wyglądać tak:

void add(int element){
int *newArray = new int[listElements];
for(int i = 0; i<listElements-1;i++){
   newArray[i] = List[i];
}
newArray[listElements-1] = element;

delete[] List;
List = newArray;
}

Teraz rozważmy co by się działa, gdyby na końcu kodu było:

 

- delete[] newArray

Zostałaby usunięta cała tablica, którą przed chwilą stworzyłeś i do której skopiowałeś. Przy następnej próbie zapisania do niej wartości, zapisałbyś miejscu w którym nie wolno ci zapisać == prawdopodobnie crash. Przy próbie odczytania - śmieci.

 

- delete newArray

"It is undefined behavior to call delete on a pointer created with new[]"

 

Radzę przeczytać całą sekcję.

http://www.parashift.com/c++-faq-lite/delete-p-doesnt-delete-p.html


PS
A jak ćwiczysz tablice dynamiczne to radzę od razu ćwiczyć na szablonach :) Przynajmniej wtedy do czegoś się przydadzą.

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...