0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 47
1

Проверить корректность двух способов выделения динамической памяти

01.11.2016, 16:34. Показов 737. Ответов 12
Метки нет (Все метки)

Решил задачку на динамическое выделение памяти, двумя способами.
Так вот сам вопрос:
подскажите, какое решение более корректно(правильное), а если есть замечания, то прошу Вас высказаться.
решение №1:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
int main(){
    int size = 0, num;
    int *n1 = 0, *n2 = 0;
    n1 = new int[size];
    n2 = new int[size];
 
while(num != -1){
    cout << "Enter number: "; cin >> num;
    if(num != -1){
            size++;
            for(int i = 0; i < size; i++) n1[i] = n2[i];
 
            n1[size-1] = num;
            if(size > 0) delete []n2;
 
            n2 = n1 ;
            for(int i = 0; i < size; i++) cout << n2[i] << " ";
        }
        cout << endl;
    }
    delete[]n1;
    return 0;
}
А вот решение №2:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main(){
    int size = 0, num;
    int *n1 = 0;
    n1 = new int[size];
 
 
while(num != -1){
    cout << "Enter number: "; cin >> num;
    if(num != -1){
            size++;
            for(int i = 0; i < size; i++)
            n1[size-1] = num;
 
            for(int i = 0; i < size; i++) cout << n1[i] << " ";
        }
        cout << endl;
    }
    delete[]n1;
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2016, 16:34
Ответы с готовыми решениями:

Корректность работы string в динамической памяти
string *p=new string Корректно ли работают методы и внутренняя реализация выделения/удаления...

Ошибка выделения динамической памяти
IDE VS 2015. Собственно есть решение, состоящее из двух проектов. Первый это статическая...

Фукция выделения динамической памяти
#include &lt;iostream&gt; using namespace std; int* form_odn (int a) {int *mas= new int; return mas;...

Алгоритм выделения динамической памяти
Объясните пожалуйста на словах, алгоритм выделения динамической памяти под двухмерный массив. ...

12
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
01.11.2016, 16:57 2
nevbie, оба кода приводят к неопределенному поведению.
2
Любитель чаепитий
3726 / 1786 / 561
Регистрация: 24.08.2014
Сообщений: 5,983
Записей в блоге: 1
01.11.2016, 16:58 3
Цитата Сообщение от nevbie Посмотреть сообщение
C++
1
2
3
int size = 0, num;
* * int *n1 = 0;
* * n1 = new int[size];
Классно, наверное, в обоих случаях массивы нулевого размера создавать. При том, что это - UB.
Вернее обращение к таким массивам - UB.
1
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
01.11.2016, 17:00 4
Цитата Сообщение от GbaLog- Посмотреть сообщение
При том, что это - UB.
new-expression с нулевым размером не UB.
Только вот элементов в выделенном массиве нет,
но потом в коде обращения к несуществующим элементам,
что уже и приводит к неопределенному поведению.
1
GbaLog-
01.11.2016, 17:03
  #5

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
new-expression с нулевым размером не UB.
Не успели, я уже исправился. :)

0
2548 / 1207 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
01.11.2016, 17:05 6
Croessmah, там UB начнётся еще с 10 строки - до обращений не дойдет "валидное" состояние)
1
Croessmah
01.11.2016, 17:06
  #7

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
Не успели, я уже исправился.
Успел.
Ваше сообщение: Последний раз редактировалось GbaLog-; Сегодня в 18:02.
Мое сообщение: Сегодня, 18:00
:D

0
GbaLog-
01.11.2016, 17:09
  #8

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Успел.
Хм..
Ну значит форум не отображает сообщения, которые были после моего, если я своё отредактировал.
Потому что я ответил и пошел инфу искать.
И понял, что я не прав немножко. :)

0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
01.11.2016, 17:39 9
rikimaru2013, а мне Вы зачем это сообщаете?
Это нужно сообщить ТС'у.


P.S. не смотрел что там на той строчке.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 47
01.11.2016, 18:57  [ТС] 10
Croessmah, GbaLog-, rikimaru2013, ОК, что такое UB? и что нужно для того, что бы исправить код? Я сам учу С++ и поэтому подсказать некому.
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.11.2016, 19:03 11
Цитата Сообщение от nevbie Посмотреть сообщение
UB
вангую: Undefined Behavior
1
Любитель чаепитий
3726 / 1786 / 561
Регистрация: 24.08.2014
Сообщений: 5,983
Записей в блоге: 1
01.11.2016, 19:06 12
Цитата Сообщение от nevbie Посмотреть сообщение
что такое UB?
Неопределенное поведение.
http://en.cppreference.com/w/cpp/language/ub
Цитата Сообщение от nevbie Посмотреть сообщение
что нужно для того, что бы исправить код?
Определить size положительным значением.
Присвоить num значение до 10 строчки.
Не увеличивать size в 13 строке, потому что это приведёт к выходу за пределы массива и, соответственно, к UB.
Ну это только избавление от UB. А остальное в Ваших руках.
Цитата Сообщение от nevbie Посмотреть сообщение
Я сам учу С++ и поэтому подсказать некому.
Мне тоже некому подсказать, но я использую замечательные средства - книги и google.
1
С чаем беда...
Эксперт CЭксперт С++
9982 / 5336 / 1459
Регистрация: 18.10.2014
Сообщений: 12,828
01.11.2016, 19:13 13
Цитата Сообщение от nevbie Посмотреть сообщение
какое решение более корректно
Решение чего? О каком "решении" может идти речь, если вы пока ни слова не сказали о задаче? Что "решаем"-то?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2016, 19:13
Помогаю со студенческими работами здесь

Диагностика выделения динамической памяти
Здравствуйте, господа знатоки. Подскажите, пожалуйста, как проверить, было ли выделение памяти из...

Принцип выделения места в динамической памяти
Есть такой код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() {...

Работа с массивами с использованием выделения динамической памяти
Помогите решить вот такие задачи: Задача №1 Дана последовательность чисел b1,...,bn. Получить...

Динамическая матрица с контролем корректности размерности и успешности выделения динамической области памяти
Создать двумерный динамический массив вещественного типа, размерность и содержимое элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru