Как бороться с динамическим размещением при реализации списка объектов?

Мне пришлось реализовать функцию, которая выглядела так:

MyList * sum (MyList * l1, MyList * l2) {
MyList * newlist = new MyList();
//Adds two objects and place the result in a third new list
return newlist;
}

Функция взяла два списка и поместила сумму каждого объекта в новый список. MyList класс имел узлы с указателями на next переменная и объекты внутри списка были определены пользователем.

И это заставило меня задуматься — как мне быть с динамическим распределением памяти от объектов и самого списка? Так как мне пришлось создавать память для каждого из объектов нового списка.

Есть ли способ поместить значения суммы объектов в новый список, не полагаясь на динамическое распределение? Может быть, делая что-то вроде этого:

Object result(node1->content + node2->content);
Node->content = &result; // will this object be erased when the function ends?

вместо этого:

Node->content = new Object(node1->content + node2->content);

Как мне иметь дело с временем жизни нового списка, созданного внутри функции, относительно переменной, которая будет хранить память после завершения функции? Могу ли я сделать что-то подобное при возврате нового списка?

MyList & sum (MyList * l1, MyList * l2) {
//Create variable without allocating memory and return it's reference
}

Короче, Мое главное сомнение в том, как справиться с временем жизни объекта, который создается внутри функции и будет удерживаться другим объектом.

6

Решение

Object result(node1->content + node2->content);
Node->content = &result; // will this object be erased when the function ends?

Да, если result создается внутри тела функции с синтаксисом, показанным выше, он будет уничтожен при завершении функции.

Это причина, почему вы должны использовать new и динамическое распределение: таким образом, ваши объекты создаются на куча (вместо локального стека функций), и они «переживают» конец функции, в которой они созданы. И вы можете передать возвращенный указатель обратно вызывающей стороне. Конечно, абонент должен правильно delete возвращаемый указатель, в противном случае у вас возникают утечки памяти (или другого ресурса).

В современном C ++ вы должны использовать уже определенные умный указатель классы, как std::shared_ptr или же std::unique_ptrи ваш код почти никогда не должен использовать явный new а также delete (если вы не разрабатываете какую-то пользовательскую высокооптимизированную структуру данных и вам не требуется более детальный контроль над распределением памяти на низком уровне — и даже в этом случае явный вызов кода new а также delete должен быть надежно обернут внутри границ класса RAII).

Тем не менее, мне кажется, что ваш код больше похож на упражнение по программированию, и, вероятно, целью этого упражнения является изучение динамического распределения памяти с явным new а также delete, На самом деле, в коде производственного качества вместо использования собственного класса списка вы можете использовать уже доступный стандартный шаблон класса связанного списка, например std::list,

0

Другие решения

Node->content = &result; // will this object be erased when the function ends?

Да, так как это локальная переменная. Как только его функция заканчивается resultПожизненная


MyList & sum (MyList * l1, MyList * l2) {
//Create variable without allocating memory and return it's reference
}

Это тоже не удастся по тем же причинам, что и выше.


Я предлагаю вам использовать std::shared_ptr или же std::unique_ptr. Если хотите, прочитайте Различия между unique_ptr и shared_ptr.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector