Код я приводить не буду. Он достаточно сложен, чтобы сходу так разобраться. Даже сама идея алгоритма очень трудна для понимания. А уж по поводу реализации то и подавно. А в чем проблема попытаюсь объяснить.
new a0;
new ptr_a;
цикл (по условию)
{
new b; b = F(ptr_a);
new a; a = G(b);
ptr_a = a;
delete b;
if (условие выполняется) => delete a;
}
delete a0;
delete ptr_a;
Надеюсь схему привел достаточно понятно и наглядно. В чем проблема?
Если убрать цикл (т.е. при однократном проходе), то все работает идеально, вообще никаких проблем.
Проблема возникает при повторном проходе, при второй, третьей итерации и т.д.
Условие не выполняется, следовательно запускается повторно. Мы имеем реальный, нормальный массив а, массива b нет. Заходим в цикл - первая строчка цикла выполняется без проблем. Создаем массив b, находим значения массива b, массив а нам уже не нужен. Его необходимо удалить, чтобы создать заново с новой размерностью.
Например по условию - if (проход !=1) => delete a;
И все приехали. Хотя массив а существует, реальный, нормальный, а удалить его нельзя.
Более того, то, что оператор < delete a > находится строчкой выше оператора < new a > воспринимается как синтаксическая ошибка.
Если вкратце, то так.
Этот подход аналогичен подходу, когда при каждом прогоне создается новое имя. Памяти используется, конечно, чуть меньше, но не совсем то, что хотелось бы. Есть и такая версия.
Да Visual Studio не дает ставить оператор delete перед оператором new. Проблема как раз в этом. Выдается ошибка на этапе компиляции. А ухищрения в том, что пытаюсь показать, что это повторный проход и что объект уже создан.
Я знаю как реализовать, я написал программу, она работает прекрасно. Меня как раз интересует вопрос: “Как реализовать такой алгоритм, используя динамическую память на С++ и только два имени”? Именно для уменьшения объема используемой памяти. Не нравится, когда используется только 10-я или 100-я часть из зарезервированного объема. На бумаге алгоритм работает прекрасно. Вопрос: "Как реализовать программно"?
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
new a0;
new ptr_a;
цикл (по условию)
{
new b; b = F(ptr_a);
new a; a = G(b);
ptr_a = a;
delete b;
if (условие выполняется) => delete a;
}
delete a0;
delete ptr_a;
Надеюсь схему привел достаточно понятно и наглядно. В чем проблема?
Если убрать цикл (т.е. при однократном проходе), то все работает идеально, вообще никаких проблем.
Проблема возникает при повторном проходе, при второй, третьей итерации и т.д.
Условие не выполняется, следовательно запускается повторно. Мы имеем реальный, нормальный массив а, массива b нет. Заходим в цикл - первая строчка цикла выполняется без проблем. Создаем массив b, находим значения массива b, массив а нам уже не нужен. Его необходимо удалить, чтобы создать заново с новой размерностью.
Например по условию - if (проход !=1) => delete a;
И все приехали. Хотя массив а существует, реальный, нормальный, а удалить его нельзя.
Более того, то, что оператор < delete a > находится строчкой выше оператора < new a > воспринимается как синтаксическая ошибка.
Если вкратце, то так.