(C ++) Могу ли я передать указатель на массив кучи, который я создаю в функции, на main без утечки памяти? - PullRequest
0 голосов
/ 17 октября 2019

Я работаю над проектом, предназначенным для понимания управления памятью с использованием C ++,

Внутри функции, если я создаю динамический массив из x объектов моего класса, выполняю функции, а затем возвращаю указатель намассив выглядит так:

std::string* function("myfile.txt"){
    Student *ptr = new newStudents[50];

    //stuff to parse values from the txt and then instantiate my classes

    return *x;
}

Затем я буду вызывать из кучи в main и других функциях, которые будут вызывать delete[] каждый раз, когда я закончу с использованием массива классов.

Будет ли утечка памяти передавать указатель кучи из функции обратно в основной и / или другие функции, если я не забуду удалить блок кучи из основного?

Ограничения : без умных указателей, без пространства имен и без C ++ 11 или выше.

Это для назначения. Вся помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Правильный синтаксис:

MyClass* function(const char* file) {
    MyClass *x = new MyClass[50];  //class_type* array_name = new class_type[amount];

    //stuff to parse values and then instantiate my classes

    return x;  // return x directly as a pointer..
}

Первый. НЕ разыменовывайте указатель, полученный из new, и не возвращайте его, потому что это не указатель на указатель или указатель на экземпляр. Это буквально указатель на память массива, и, разыменовав его, вы будете возвращать экземпляр и терять остальные ... что приведет к утечке.

Итак, теперь вы можете сделать следующее:

int main()
{
    MyClass* array = function("some_file.txt");
    // do something with the array above..
    delete[] array;  //clean up..
}
1 голос
/ 17 октября 2019

Да.

char* allocate_buffer() {
    return new char[10];
}

int main() {
    auto buf = allocate_buffer();
    delete [] buf;
}

Нет утечек памяти. Вы должны использовать std::array или std::vector вместо управления памятью вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...