• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy tak powinno się zmieniać rozmiar tablicy dynamicznej ? C++

Object Storage Arubacloud
0 głosów
2,036 wizyt
pytanie zadane 22 lutego 2018 w C i C++ przez Programeł Gaduła (3,500 p.)

Witam

Czy tak powinno się zmieniać rozmiar tablicy ?

sposób pierwszy:

int* tab = new int[3];

int* copy_tab = new int[3];

//inicjalizacja copy_tab = tab

delete [] tab;

int* tab = new int[4];

//inicjalizacja tab = copy_tab

delete [] copy_tab;

sposób drugi:

int* tab = new int[3];

int* copy_tab = new int[3];

//inicjalizacja copy_tab = tab

tab = new int[4];

//inicjalizacja tab = copy_tab

delete [] copy_tab;

W VS 2017 Oby dwa sposoby działają.

3 odpowiedzi

+2 głosów
odpowiedź 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 22 lutego 2018 przez Programeł
 
Najlepsza
#include <iostream>
#include <cstring>
#include <cstdlib>

int main() {
    // (1)
    constexpr static size_t table_size = 20;

    int * table1 = new int[table_size];

    // table usage...

    // allocate new table
    int * newTable1 = new int[table_size * 2];

    // copy data from old table to new table
    memcpy(newTable1, table1, table_size * sizeof(table1[0]));
    
    // delete old table
    delete [] table1;

    // delete old table
    delete [] newTable1;

    // (2)
    int * table2 = new int[table_size];

    // mem realloc and copy data
    int * newTable2 = static_cast<int *>(realloc(table2, table_size * 2 * sizeof(table2[0])));

    if(newTable2 == NULL) {
        std::cerr << "realloc() error\n";
        exit(EXIT_FAILURE);
    }

    // new table usage
    
    // delete new table
    delete [] newTable2;

    return EXIT_SUCCESS;
}

Masz tu 2 sposoby dość niskopoziomowe.

PS. W drugim sposobie jest spora szansa że dostaniesz ten sam wskaźnik i przez to spadnie chwilowe zużycie pamięci. Czasem może to mieć znaczenie :-)

komentarz 22 lutego 2018 przez Programeł Gaduła (3,500 p.)
Dzięki wielkie za odpowiedz

Napewno przydadzą mi się te przykłady :) Jednak funkcje memcpy będę musiał wykluczyć, ponieważ robie tablice obiektów własnej klasy. memcpy z tego co mi wiadomo nie aktywuje konstruktorów.
komentarz 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
To prawda. Nie aktywuje. W zależności jakie rodzaje obiektów trzymasz w tablicy, możesz albo użyć memcpy(..) albo konstruktorów kopiujących/przenoszących. Tablice są bardzo niewdzięczne jeśli chodzi o obiektowość :-)
+1 głos
odpowiedź 22 lutego 2018 przez Bondrusiek Maniak (61,370 p.)
Witam,

wydaje mi się że pierwszy sposób jest poprawny bo po alokacji fragmentu pamięci zwalniasz go delete[]. Następnie znów rezerwujesz pamięć. W drugim przypadku rezerwujesz pamięć ale nie zwalniasz jej przy kolejnej alokacji więc fragment pamięci jest zarezerwowany mimo że do niego nie ma dostępu.
komentarz 22 lutego 2018 przez Programeł Gaduła (3,500 p.)
Dzieki wielkie za odpowiedz ;)
+1 głos
odpowiedź 22 lutego 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Pierwszy sposób jest poprawny, jednakże niepotrzebnie dwukrotnie kopiujesz elementy. Zaalokuj nowy obszar pamięci o większym rozmiarze (nazwij go np. newTab) i przekopiuj do niego zawartość tab. Następnie usuń stary bufor (delete [] tab) i przekopiuj wartość wskaźnika  (tab=newTab). Krótkie i efektywne smiley

komentarz 22 lutego 2018 przez Programeł Gaduła (3,500 p.)

Dzięki za odpowiedz 

I wiem że można to też w taki sposób zrobić ale tablice tab mam w klasie, dlatego tworze drugi raz tablice o tej samej nazwie :)

Podobne pytania

0 głosów
2 odpowiedzi 432 wizyt
pytanie zadane 21 lutego 2018 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 368 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 12 grudnia 2018 w C i C++ przez four Użytkownik (720 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...