LINUX.ORG.RU

Можно писать на C++ без утечек памяти?


0

0
Рассматривается написание сложных программ и конечно с использованием сложных классов, темплейтов, умных указателей и всего такого.

Ясно, что аккуратное программирование позволит написать аккуратную, хорошо сопровождаемую программу без утечек, сегфолтов, гонок и прочих огорчительных побочных эффектов.

Вопрос в том возможно ли так писать ПРАКТИЧЕСКИ, не прилагая сверхусилий и получая правильный код? Или C++ здесь не годится?

Стали закрадываться подозрения, что навороченные возможности C++ попахивают булшитом для проекта по одной, но очень важной причине: они не избавляют ПОЛНОСТЬЮ от необходимости держать в голове подробности реализации, иначе можно запросто зевнуть освобождение памяти или обратиться к нулевому указателю.

anonymous
Поток сознания.

>Стали закрадываться подозрения, что навороченные возможности C++ попахивают булшитом для проекта по одной, но очень важной причине: они не избавляют ПОЛНОСТЬЮ от необходимости держать в голове подробности реализации, иначе можно запросто зевнуть освобождение памяти или обратиться к нулевому указателю.

Это ИМХО надо делать в любом языке программирования.

wfrr ★★☆
()

ну вообще-то неинициализированных указателей при грамотном использовании std::auto_ptr/boost::shared_ptr/array не бывает в принципе.

// wbr
klalafuda ★☆☆
()
>держать в голове подробности реализации

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

generatorglukoff ★★
()
> Вопрос в том возможно ли так писать ПРАКТИЧЕСКИ

Да, только надо заставить себя писать правильно :-)

no-dashi ★★★★★
()
Возможно, но нужно быть внимательным. И знать узкие места тех же "умных" указателей (типа шаблонного auto_ptr). "Сверхусилия" не нужно прикладывать никогда, если четко знаешь что тебе нужно и используешь соответствующий ЯП подход.

Короче, если позволяет время, то пиши на C++. Если нужен срочно результат, возможно стоит попробовать java.

Demon37 ★★★★
()
Писать можно, но экономически нецелесообразно. Вообще С++ плохо подходит для больших проектов. Узких мест где нужна скорость довольно мало, а ошибки могут возникнуть везде. То есть лучше взять что то более безопасное и высокоуровневое, а если не хватает скорости, найти профайлером узкие места и переписать на С/С++. Тем более для прототипирования С/С++ совсем не подходит.
imp ★★
()
Ответ на: комментарий от imp
> Писать можно, но экономически нецелесообразно. Вообще С++ плохо подходит для больших проектов. Узких мест где нужна скорость довольно мало, а ошибки могут возникнуть везде. То есть лучше взять что то более безопасное и высокоуровневое, а если не хватает скорости, найти профайлером узкие места и переписать на С/С++. Тем более для прототипирования С/С++ совсем не подходит.

просто интересно - а что вы подразумеваете под термином "большой проект"? это сколько?

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от Demon37
> И знать узкие места тех же "умных" указателей (типа шаблонного auto_ptr). "Сверхусилия" не нужно прикладывать никогда, если четко знаешь что тебе нужно и используешь соответствующий ЯП подход.

Вот, сверхусилия не нужны, но внимание рассеивается и можно чего-нибудь забыть.

anonymous
()
Ответ на: комментарий от yz
>А что делать, когда проект большой и критичный к скорости код занимает более 90%?

(Стреляться || Искать кучу бабла на крутых спецов) :)

imp ★★
()
Ответ на: комментарий от klalafuda
> просто интересно - а что вы подразумеваете под термином "большой проект"? это сколько?

Ну я думаю начиная от 100 000 строк

imp ★★
()
Ответ на: комментарий от imp
>> просто интересно - а что вы подразумеваете под термином "большой проект"? это сколько? > Ну я думаю начиная от 100 000 строк

понятно. работал и в таких, причём 90% C++ и тяжёлое наследие от C. не смотря на последнее и то, что над проектом в разное время трудилось под сотню человек, тем не менее вполне стабильно летает. никаких претензий к языку. естественно подразумевается, что разработчики владеют им в достаточной степени.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от timofeji
> Если руки прямые, можно из гавна замки строить

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

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda
> интересно посмотреть на живой пример такого замка. чтобы утверждение не было столь голословным.

Eclipse?

troorl ★★
()
Ещё ~500 строк к проекту - и будешь иметь код, который укажет тебе на утечки и неинициализированные указатели. Правда, в рантайме.
anonymous
()
Если писать много юниттестов и прогонять их под valgrind-ом (естественно исправляя всё, на что он ругается), то код будет вполне стабильным.
Legioner ★★★★★
()
Ответ на: комментарий от troorl
> Eclipse?

а что не так с эклипсой? как раз этот проект год от года лишь матереет и улучшается, не смотря на обилие разношёрстных команд, архитекторов, кодеров, стандартов и хотелок.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от troorl
>> он тактично назвал эклипс замком а джаву говном.
> Как хорошо, когда тебя понимают :)

но в то же время плохо, когда не аргументируют свои заявления :-/

// wbr
klalafuda ★☆☆
()
Данный вопрос сабжа подробно освещен тут http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654&pg=1#4576462 тут http://forum.ixbt.com/topic.cgi?id=26:33626 и тут http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654&pg=1#4576462 Рекомендую обратить внимание на "При том, что оппонент сделал одну серьёзную и типично Сишную ошибку (запутался в типах, в результате затерлись нужные данные), а я одну мелкую и "общую" (перепутал тип поля в БД)"
anonymous
()
Ответ на: комментарий от anonymous
> Данный вопрос сабжа подробно освещен тут http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654&pg=1#4576462 тут http://forum.ixbt.com/topic.cgi?id=26:33626 и тут http://www.sql.ru/forum/actualthread.aspx?bid=16&tid=466654&pg=1#4576462 Рекомендую обратить внимание на "При том, что оппонент сделал одну серьёзную и типично Сишную ошибку (запутался в типах, в результате затерлись нужные данные), а я одну мелкую и "общую" (перепутал тип поля в БД)"

данный вопрос действительно подробно освещён не в проножурналах а на http://www.gotw.ca/gotw/index.htm

// wbr
klalafuda ★☆☆
()
Ответ на: комментарий от anonymous
>Вот, сверхусилия не нужны, но внимание рассеивается и можно чего-нибудь забыть.

Это общечеловеческая проблема :)

Demon37 ★★★★
()
На паскале можно
anonymous
()
Можно.

Использовать boost::shared_ptr, boost::weak_ptr вместо указателей. На голые указатели наложить запрет (ну без фанатизма - если ситуация требует напрмер для работы с буфером, передача в другие компоненты, профайлер сказал, что в этом месте ботелнек, ... - то юзать raw указатели даже нужно).

Также не использовать масивов, а всесто них std::vector<T> и boost::array<T>.

По возможности (если профайлер позволяет) - надо использовать готовые алгоритмя и контейнеры (STL, boost, ...) - они достаточно оттестированы и вероятность что вы отгребете ошибки значительно меньше, нежели если бы вы писали сами.
Если скорость контейнера вас не устраивает - посмотрите в сторону оптимизировать контейнер, а не переписывать его на свой.

Используйте валгринд.

ЗЫ. от проблем аля дедлоки, обращение к невалидному итератору, рейс кондишен вас никто не спасет
anonymous
()
Ответ на: комментарий от yz
> А что делать, когда проект большой и критичный к скорости код занимает более 90%?

Умертвить архитекторов, нанять новых, которые напроектируют критичную к скорости часть в пределах 20%

mv ★★★★★
()
Ответ на: комментарий от mv
>> А что делать, когда проект большой и критичный к скорости код занимает более 90%?

>Умертвить архитекторов, нанять новых, которые напроектируют критичную к скорости часть в пределах 20%

А если это вычислительная либа?

yz
()
Ответ на: комментарий от yz
>Вопрос в том возможно ли так писать ПРАКТИЧЕСКИ, не прилагая сверхусилий и получая правильный код? Или C++ здесь не годится?

можно, годится(нужен опыт)

frozen83
()
Ответ на: комментарий от klalafuda
> а что не так с эклипсой? как раз этот проект год от года лишь матереет и улучшается, не смотря на обилие разношёрстных команд, архитекторов, кодеров, стандартов и хотелок.

Улучшается -- да, но никак не стабилизируется и не ускоряется. Вот работаю вторую неделю с 3.3, так после 3.2 хоть и стал пофункциональнее, а плеваться хочется больше.

gaa ★★
()
> Стали закрадываться подозрения, что навороченные возможности C++ попахивают булшитом для проекта по одной, но очень важной причине: они не избавляют ПОЛНОСТЬЮ от необходимости держать в голове подробности реализации, иначе можно запросто зевнуть освобождение памяти или обратиться к нулевому указателю.

Назовите язык где можно ПОЛНОСТЬЮ абстрагироваться от реализации, без рисков выедания памяти или тормозов?

Непонятно, почему претензии именно к C++? Обратиться к нулевому указателю можно и в Java, и даже NullPointerException поймают, далеко не факт что программа после этого останется в рабочем состоянии. Зачастую не работает даже выход и программу приходится убивать.

Зевнуть освобождение памяти - аллокируйте вещи на пулах и потом сносите их целиком. garbage collection не является глобальной панацеей от всех утечек - там все равно можно попытаться построить бесконечный список или забыть отдать какие-то внешние ресурсы или еще чего.

Не надо C++ винить, плохому танцору известно что мешает и java/С# от этого не спасают

gods-little-toy ★★★
()
Ответ элементарный — сначала думаешь, потом пишешь. Продуманное проектирование, документация, четкие контракты — и об отладчике, valgrind'е и так далее можно практически забыть. Даже тупые representation checks сами по себе позволяют контролировать большинство ошибок. И неважно — C, C++, Java — не brainfuck, и уже хорошо.
grob ★★★★★
()
Ответ на: комментарий от klalafuda
> но в то же время плохо, когда не аргументируют свои заявления :-/

А я ничего и не заявлял, просто сложил два + два :)

troorl ★★
()
можно конечно, просто надо думать головой перед тем как писать, и если уж пишешь, что пользоваться smart pointers и прочими вещами, которые уже давно придуманы человечеством
ott ★★★★★
()
Ответ на: комментарий от yz
>>> А что делать, когда проект большой и критичный к скорости код занимает более 90%?

>>Умертвить архитекторов, нанять новых, которые напроектируют критичную к скорости часть в пределах 20%

>А если это вычислительная либа?

Если речь идёт о математичиских вычислениях. То лучше оптимировать путём поиска или разработки подходяших математических алгоритмов. В этом случае скорость сходимости (?) (Rate of convergence) поважнее будет. Написать тестовый алгоритм в scipy ,octave,scipy или R-lang. Потом уже можно оптимировать например путём замены критичного кода старыми добрыми и десятилетиями проверенными фортран кодами.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.