Kopiowanie dynamicznie alokowanej pamięci

0

Hej wszystkim, natrafiłem na problem z kopiowaniem dynamicznie alokowanej pamięci.

mam taką funkcję:

// Funkcja tworząca tablicę z losowymi wartościami
int* createRandomSortedTable(int numbers)
{
    // Tworzymy dynamiczną tablicę
    int* table = new int[numbers];
    srand(time(NULL));

    for (int i = 0; i < numbers; i++)
    {
        table[i] = (rand() % numbers) + 1;
    }
    return table;
}

i teraz próbuję skopiować uzupełnioną już tablicę o losowe liczby do dwóch osobnych tablic, żeby przeprowadzić pomiar na takich samych zestawach liczbowych. Oczywiście poniżej robię to źle i tutaj pytanie jak skopiować taką tablicę prawidłowo?
Bo jeśli dobrze rozumiem, moje "kopiowanie" to po prostu zapisywanie informacji o lokalizacji tablicy a nie jej skopiowanie do osobnego miejsca.

int* tab1 = createRandomSortedTable(numbers);
int* tableSortedMS = tab1;
int* tableSortedIS = tab1;

Dziękuję za pomoc

1

Już w słowach masz problem,a słowa są ważne:
nie "kopiowanie pamięci" a "kopiowanie zawartości pamięci"

Przerobiłeś jakąś dobrą książkę, albo rzetelny kurs? To są zagadnienia, które tam są objaśnione

2

Jak się domyślasz, potrzebujesz stworzyć sobie nowe miejsce na takie liczby. Sposób który działa, ale który nie jest z różnych powodów bardzo elegancki:

int* copy(int* table, size_t size) {
   int* ret = new int[size];
   for (size_t i = 0; i < size; ++i) {
      ret[i] = table[i];
   }
}

Potem sobie robisz dwie kopie.
A jeśli chodzi o to, czemu to jest złe, to patrz na linka:
https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/

4

Użyj std::vector, zwróć std::vector, skopiuj std::vector. Nie baw się w new ani new[].

https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/
https://dsp.krzaq.cc/post/180/

0

Mogę tu się mylić, ale new[] nadal będzie lepsze od std::vector w obliczeniach numerycznych, gdy:

  • stosujemy OpenMP + ew. SIMD - ponieważ raczej kompilator OpenMP nie obsługuje kontenerów C++ (ale może się mylę)
  • przesyłamy dane w shared memory, ponieważ std::vector nie można zaalokować poza zwykłą stertą

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0