Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
thechicho
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 14
Завершенные тесты: 1
#1

Все ли хорошо в этом коде - C++

17.08.2016, 10:31. Просмотров 632. Ответов 27
Метки нет (Все метки)

Предложите ваши варианты решения заданий
3. Все ли хорошо в этом коде?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Файл legacy.c
int values[3];
 
Файл modern.cpp
#define LEGACY_SIZE 3
extern int *values;
 
class MyBlah {...};
 
class Adapter
{
public:
    Adapter()
    {
        for (int i = 0; i < LEGACY_SIZE; ++i)
            map_[values[i]] = new MyBlah (values[i]);
    }
private:
    std::map<int, MyBlah *> map_;
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2016, 10:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Все ли хорошо в этом коде (C++):

почему то первый в этом коде у меня не нулевой элемент а идет по порядку все - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;locale.h&quot; #define countof(array) (sizeof(array) /...

Что не правильно в этом коде? - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { float I; //Годовая процентная...

Что в этом коде не правильно? - C++
Как правильно синтезировать этот код? array и array_size - выдает ошибку double avg = 0; for (int i = 0; i&lt;array_size; i++) avg +=...

Сколько методов реализовано в этом коде? - C++
Сколько методов реализовано в этом коде? и какие? using namespace std; class Exem { private: char *name; // имя int data; //...

Посоветуйте альтернативу scanf() в этом коде - C++
// не работает scanf() в цыкле if, если же перед %c поставить пробел почему то, если ввести Y то происходит // замещение строк,...

помогите в этом коде записать в файл - C++
считывал с файла и выводил в файл #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstring&gt; #include &lt;cstddef&gt; using namespace...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
17.08.2016, 22:24 #2
thechicho,

1.
C++
1
int values[3]; // <--- глобальный объект инициализируется нулями
таким образом это:
C++
1
2
for (int i = 0; i < LEGACY_SIZE; ++i)
            map_[values[i]] = new MyBlah (values[i]);
тоже самое что и:

C++
1
2
for (int i = 0; i < LEGACY_SIZE; ++i)
        map_[0] = new MyBlah (0);  //<--- утечка памяти
2.
отсутствие диструктора ---> утечка памяти

3.
нарушение правила трех:
отсутствие конструкторов копии/перемещания и соответствующих операторов =
приведет к крашу при попытке освободить память.

4.
C++
1
for (int i = 0; i < LEGACY_SIZE; ++i)
счетчик цикла должен быть size_t

C++
1
for (size_t i = 0; i < LEGACY_SIZE; ++i)
0
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 572
17.08.2016, 22:31 #3
Цитата Сообщение от hoggy Посмотреть сообщение
отсутствие диструктора ---> утечка памяти
дабы утечки не было нужно в деструкторе написать delete[] map_; ?
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
17.08.2016, 23:12 #4
Цитата Сообщение от dailydose Посмотреть сообщение
дабы утечки не было нужно в деструкторе написать delete[] map_; ?
нужно книжки читать: "базовый курс для самых маленьких"
0
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 572
18.08.2016, 05:56 #5
Цитата Сообщение от hoggy Посмотреть сообщение
для самых маленьких
На каждый new должнен быть свой delete, разве нет?
В языке программирования C++ оператор delete возвращает память, выделенную оператором new, обратно в кучу. Вызов delete должен происходить для каждого вызова new, чтобы избежать утечки памяти.
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
18.08.2016, 07:43 #6
Цитата Сообщение от thechicho Посмотреть сообщение
Файл legacy.c int values[3];
Цитата Сообщение от thechicho Посмотреть сообщение
Файл modern.cpp
#define LEGACY_SIZE 3
extern int *values;
Т.к. расширения файлов разные (с и срр), то компоновщик такой проект не соберет
0
avgoor
909 / 544 / 117
Регистрация: 05.12.2015
Сообщений: 1,508
18.08.2016, 11:09 #7
Цитата Сообщение от zss Посмотреть сообщение
Т.к. расширения файлов разные (с и срр), то компоновщик такой проект не соберет
С чего бы вдруг? Компоновщик собирает исполняемый файл из объектных, в которых уже нет информации о языке в явном виде. И, если соглашения о вызовах совпадают - мешайте хоть c brainfuck-ом.
1
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
18.08.2016, 12:28 #8
Вроде никто не написал про различие типов переменных values

Цитата Сообщение от hoggy Посмотреть сообщение
счетчик цикла должен быть size_t
Кому должен?
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
18.08.2016, 13:30 #9
Цитата Сообщение от Voivoid Посмотреть сообщение
Кому должен?
всему мировому сообществу в целом,
и корректно оформленной программе в частности.

ну или хотите писать грамотно - пишите size_t.
или будьте быдлокодерами.

вопрос не в том "кому ?", а вопрос в том: "почему это так?"
надеюсь объяснять причины не нужно?
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
18.08.2016, 13:41 #10
Цитата Сообщение от avgoor Посмотреть сообщение
С чего бы вдруг?
Проверил экспериментально на VS 2008.
Может где-то и не так. Но у автора вопроса явно было это на уме, иначе не стал бы давать разные расширения.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
18.08.2016, 13:43 #11
Цитата Сообщение от hoggy Посмотреть сообщение
и корректно оформленной программе в частности.
Если тип счетчика цикла отличен от size_t, то программа становится некорректно оформленной? Кстати, что это вообще значит "корректно оформленная"?

Цитата Сообщение от hoggy Посмотреть сообщение
надеюсь объяснять причины не нужно?
Конечно нужно. Еще неплохо бы увязать объяснение с тем, что ключ у map'а имеет тип int и LEGACY_SIZE это тоже int
0
avgoor
909 / 544 / 117
Регистрация: 05.12.2015
Сообщений: 1,508
18.08.2016, 13:50 #12
Цитата Сообщение от zss Посмотреть сообщение
Проверил экспериментально на VS 2008.
Плохо проверяли. В часности:
Цитата Сообщение от avgoor Посмотреть сообщение
если соглашения о вызовах совпадают
то есть должно быть extern "C". Плюс не int *values, а int values[LEGACY_SIZE].
Что не равносильно этому:
Цитата Сообщение от zss Посмотреть сообщение
Т.к. расширения файлов разные (с и срр), то компоновщик такой проект не соберет
1
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,122
Завершенные тесты: 1
18.08.2016, 15:28 #13
Цитата Сообщение от Voivoid Посмотреть сообщение
Если тип счетчика цикла отличен от size_t, то программа становится некорректно оформленной?
да, если используемый тип не поддерживает диапазон значений size_t.

Цитата Сообщение от Voivoid Посмотреть сообщение
Кстати, что это вообще значит "корректно оформленная"?
корректно оформленная - корректна с точки зрения стандарта,
и гарантирует инвариант.

точное определение вы можете прочитать в стандарте:
(well-formed)

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

int - не гарантирует.

соответственно, использование int - потенциальная мина.
использование size_t - превентивно безопасно.

кроме технической стороны дела существует здравый смысл.

у вас что: индексы или размеры массивов могут быть отрицательными?
вы почему используете знаковый тип для хранения беззнаковых величин?
что за маразм?

Добавлено через 45 секунд
Цитата Сообщение от Voivoid Посмотреть сообщение
Еще неплохо бы увязать объяснение с тем, что ключ у map'а имеет тип int и LEGACY_SIZE это тоже int
потому что говнокод.
0
avgoor
909 / 544 / 117
Регистрация: 05.12.2015
Сообщений: 1,508
18.08.2016, 15:37 #14
Цитата Сообщение от hoggy Посмотреть сообщение
у вас что: индексы или размеры массивов могут быть отрицательными?
вы почему используете знаковый тип для хранения беззнаковых величин?
что за маразм?
Потому, что данные не только хранятся, но и иногда обрабатываются И, если где-то отрицательные числа, таки, понадобятся - беззнаковые тоже могут превратиться в мину. + Учитывая, что в студии размер массива не может превышать 4Gb - проблемы возникнут только для массива char длиной более 2Gb. Для массивов всех других типов (если размер типа больше 1) проблем не возникнет.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
18.08.2016, 15:40 #15
Цитата Сообщение от hoggy Посмотреть сообщение
у вас что: индексы или размеры массивов могут быть отрицательными?
вы почему используете знаковый тип для хранения беззнаковых величин?
что за маразм?
Ну это интересный вопрос, std::string::find же возвращает npos который как бы -1.

Добавлено через 2 минуты
thechicho, основные в том к чему int values[3]; объявлен глобально, а не внутри класса.
Т.е. если были был массив констант тогда ...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2016, 15:40
Привет! Вот еще темы с ответами:

Как пронумеровать текст в этом коде? - C++
Очередной вопрос от полного профана в C++ Для проверки создал цикл while do, решил пронумеровать, но тут такая дилемма - #include...

Как дописать цикл в этом коде? - C++
#include &lt;graphics.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;dos.h&gt; class wheel { int X,Y;...

Структура (найти ошибку в этом коде) - C++
Добрый день. Возникла такая проблема, не могу найти ошибку в этом коде, выводит непонятные символы. Уже все перепробовал) #include...

Нужно найти ошибки в этом коде. - C++
//Этот код ничего не делает мне просто нужно понять где ошибки #include &lt;iostream.h&gt; struct info { char anun,azg; int toshak; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.08.2016, 15:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru