Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: C/C++ malloc vs new  (Прочитано 1763 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
C/C++ malloc vs new
« : 20 Мая 2013, 16:11:55 »
Читал что malloc от new отличается более сложным видом и тем что malloc/free не вызывают конструктор/деструктор, но...

(Нажмите, чтобы показать/скрыть)


но вот на malloc/free вообще бред + падает на очистке еще

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 21 Мая 2013, 11:34:33 от _XDD_ »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #1 : 20 Мая 2013, 16:44:35 »
0) массив bool'ов само по себе сомнительное занятие, ну хрен с ним.
1) const uint16_t& - бред. чисто физически реализуется через указатель который будет тупо длинее 16-битного целого, а стек не резиновый
2) u_int16_t uint16_t хоть и одно и то же но объявления из разных мест смешиваются - бяка
3) i++ - не идеально. почитай фармы инкрементов ++i будет лучше.
4) srand(time(0)); код не на столько долго выполняется и точность time заставит генератор сгенерить одинаковые строки
5) mas[ i ] = rand()%2; приведение к bool не явное, опять же смысл со всем этим bool сильно не ясен, кроме как заморочить себе голову не имея чёткого представления что и как будет
6) использование неименованных магических констант в коде - бяка. что собственно подтверждается ниже
7) i не лоакальная переменная циклов - бяка
8 ) ниже всё враз, генерим одинаковые строки, используем магические константы
9) печатаем хрень какую -то. компилятор тебя про себя в пешее эротическое послал и сгенерил поганый код который лезет туда куда не просят. printf("%d\n", mas[0][0]); ты говоришь печатать целое число. 32бита. mas[0][0] - 8бит. где остальное? правильно, насрать на границы и слазить на лево. в лучшем случае сегфолт.
10) тело цикла не выделено в скобочки. не ошибка, но не кислый шанс напортачить. программы пишутся не для компьютеров а для людей которые будут их потом читать. всё должно быть очевидно. ну или отдели удаление памяти строчкой чтобы было понятно что это точно не к циклу относится.
11) new[] должно заканчиваться delete[] а у тебя delete. И этот человек что-то имеет против языка?

Следующий кусок кода

В основном то же самое.
+ for(i = 0; i < 30; i++) мем.лик. я же говорил что использование магических констант - бяка

Ну а падает хз почему. Приеду домой  - попробую.


Действительно бред. Читай дальше и лучше.

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #2 : 20 Мая 2013, 17:23:01 »
Yurror,
0) из-за другой задачи возникла работа с bool, поэтому и не стал менять для примера.
1) можно подробнее, пожалуйста? В стек ведь всеравно запишется?
3) i++ и ++i знаю хорошо разницу. Но в данном месте не имеет значения ведь.
5) 1 - true, 0 - false. К чему тут еще приведение?
7) для чего несколько раз процессор гонять зря? Только ради того чтобы переменная прожила меньше, но выделялась чаще?
9) дело до печатания строк было, в отладчике заметил что было mas[0][0] = false, а потом таинственным способом после столького выделения памяти именно через malloc туда начались целые числа попадать. после new такого нет.
11) да, забыл про массив указателей ((
и я как бы против языка ничего не имею, меня интересует почему при выделении массива 3000*3000 через new все отлично, через malloc черт знает что...

про for(i = 0; i < 30; i++), да... тестил просто при других значениях, вот и попало сюда ((( исправил на 3000.

извиняюсь про магическое число 3000, но вот так вот...

Пользователь решил продолжить мысль 20 Мая 2013, 17:27:52:
Yurror,



Пользователь решил продолжить мысль 20 Мая 2013, 17:50:24:
Yurror,
про 1) я правильно понял, что указатель на uint16_t будет больше 16 бит и эффективнее взять больший тип данных?
но при передачи по указателю память повторно не выделяется, а как произойдет приведение из 16 бит в большее, хотя и стоит const? да и смысла в этом?
« Последнее редактирование: 20 Мая 2013, 17:50:24 от _XDD_ »

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5594
  • Все по палатам!
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #3 : 20 Мая 2013, 18:01:09 »
_XDD_,
 bool **mas = (bool **)malloc(sizeof(bool) * 3000);
Здесь у тебя sizeof(bool), когда надо брать размер указателя на bool?
Извините, я все еще учусь

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #4 : 20 Мая 2013, 18:39:30 »
SergeyIT,
спасибо большое ))))

SergeyIT, а вот этот кусочек не могли бы объяснить, пока нету автора комментария? Очень интересно((
1) const uint16_t& - бред. чисто физически реализуется через указатель который будет тупо длинее 16-битного целого, а стек не резиновый

Yurror,
спасибо еще раз за замечания, и если не сложно, чем лучше заменять тогда srand(time(0)) ?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5594
  • Все по палатам!
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #5 : 20 Мая 2013, 18:53:14 »
_XDD_,
Он говорит, как я понимаю - убери знак &
Извините, я все еще учусь

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #6 : 20 Мая 2013, 19:43:41 »
SergeyIT,
так если я уберу знак &, тогда по указателю не будет и будет копирование в переменную ф-и?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5594
  • Все по палатам!
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #7 : 20 Мая 2013, 22:48:12 »
_XDD_,
Зато в стеке будет не 4, а 2 байта. И непонятно, зачем тебе по указателю надо?
Извините, я все еще учусь

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #8 : 21 Мая 2013, 05:30:32 »
Да, в теме уже отписались. Но для верности:

Числа эффективнее и проще передавать по значению. Если это конечно не uint128_t и условие задачи не требует использования ссылок или указателей.

По поводу srand(time(0)). Я бы написал srand(time(NULL));, но это второстепенно. У тебя время генерации строк матрицы меньше секунды, а time() даёт секундную точность => строки будут сгенерены одинаковые. srand(time(NULL)); надо вызывать один раз при старте программы и всё.

Напиши себе const size_t mas_size = 3000; и пользуйся mas_size чтобы не писать 3000 везде и править сто раз.
Индекс i тоже надо сделать size_t. Соответственно подправить прототип функции которая генерит строки void setRand(bool *mas, size_t сount);

printf ты так и не исправил. придётся написать что-то типа printf("%d\n", (int)mas[0][0]);

SergeyIT,
+1. слона то с указателем я и не приметил. =)

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #9 : 21 Мая 2013, 11:30:07 »
Yurror,
спасибо )) сейчас исправлю все ж таки код, и почитаю про size_t, и почему будет в стеке не 2 байта а 4...

эх, почаще бы такую взбучку за код... )))

Пользователь решил продолжить мысль 21 Мая 2013, 11:37:14:
Yurror,
и еще такой вопрос, раз уж про код...

если на C++ работу писать, плохой ли тон использовать C библиотеки, или есть полностью все аналоги на библиотеки С++?
читал что C++ библиотеки без .h, например cstdlib вместо stdlib.h ...
« Последнее редактирование: 21 Мая 2013, 11:37:14 от _XDD_ »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: C/C++ malloc vs new
« Ответ #10 : 22 Мая 2013, 12:11:33 »
...
если на C++ работу писать, плохой ли тон использовать C библиотеки, или есть полностью все аналоги на библиотеки С++?
...
Зависит от многих условий. В основном от требований проекта, внутренних распорядков компании и процего
Я бы не считал это криминалом

...
читал что C++ библиотеки без .h, например cstdlib вместо stdlib.h ...
Да, на это я обратил внимание, но забыл написать.
Вообще, идеологически верно в С++ писать #include <cstdlib> вместо #include <stdlib.h>
Но большинство компиляторов пока что безропотно прощают эти огрехи.

 

Страница сгенерирована за 0.063 секунд. Запросов: 25.