@Nikitos2002

Почему в программе утечка памяти?

Не могу найти ошибку в функции, все перепробовал. Есть код, нужно было добавить функцию
Задача
Вам нужно написать функцию int* my_slightly_dumb_reallocation(int* source, unsigned int n_old, unsigned int n_new) , которая меняет размер памяти, выделенной под массив целых чисел. Она должна выделить новый кусок памяти нужного размера, перенести туда данные из старого массива, очистить память по старому адресу и вернуть указатель на этот массив.

В качестве аргументов она принимает:

Указатель на массив, память для которого была выделена в куче (heap) при помощи оператора new[]. Обратите внимание, что если вам передали некорректный указатель ( NULL ), функция должна это проверять и не пытаться этот указатель разыменовывать или очищать память по этому адресу.
Количество элементов массива на момент вызова функции.
Новое количество элементов. Если оно меньше, чем старое, то вы копируете только те элементы, которые влезают, и ничего не выводите на экран. Часть данных потеряется, но это на совести того, кто вашу функцию вызывал. В реальной жизни в таком случае хорошо бы печатать предупреждение, но в формат контеста это не лезет.
Для проверки будет использоваться следующий код. Вы можете использовать его для отладки.

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int* my_slightly_dumb_reallocation(int* source, unsigned int n_old, unsigned int n_new);

int main() {
    unsigned int n, i;
    cin >> n;
    int *a = my_slightly_dumb_reallocation(NULL, 0, n / 2);
    for (i = 0; i < n / 2; i++)
        cin >> a[i];
    a = my_slightly_dumb_reallocation(a, n / 2, n);
    for (; i < n; i++)
        cin >> a[i];
    int sum = 0;
    for (i = 0; i < n; i++)
        sum += a[i];
    cout << sum << endl;
    a = my_slightly_dumb_reallocation(a, n, n / 2);
    a = my_slightly_dumb_reallocation(a, n / 2, 0);
    a = my_slightly_dumb_reallocation(a, 0, 0);
    return 0;
}

Моя функция:
int* my_slightly_dumb_reallocation(int* source, unsigned int n_old, unsigned int n_new) {
    int* array = new int[n_new];
    if (source != NULL)
    {
        for (int i = 0; i < n_new && i < n_old; i++)
        {
            array[i] = source[i];
        }
        delete[] source;
        source = nullptr;
    }
    return array;
}

Ошибки:
TEST
PASSED
==30678== 0 bytes in 1 blocks are definitely lost in loss record 1 of 1
==30678== at 0x4A06F70: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==30678== by 0x40153D: my_slightly_dumb_reallocation(int*, unsigned int, unsigned int) (002793.cpp:29)
==30678== by 0x40167D: main (002793.cpp:24)
==30678==
Помогите, пожалуйста, уж вообще никаких идей нет(
  • Вопрос задан
  • 162 просмотра
Решения вопроса 2
saboteur_kiev
@saboteur_kiev
software engineer
Ну так
int* array = new int[n_new];

А где вы его удаляете?
Ответ написан
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
my_slightly_dumb_reallocation(int*, unsigned int, unsigned int) (002793.cpp:29)

вообще никаких идей нет

вот тебе идея: посмотреть в строку 29 и ответить на вопрос "где освобождается память выделенная здесь после последнего вызова функции my_slightly_dumb_reallocation"?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы