- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
string Daumants::getReverse()
{
string message = this->data();
char *reverseMessage = new char[this->length()];
for (int i = this->length() - 1, j = 0; i >= 0; i--, j++)
{
reverseMessage[j] = message[i];
}
for (int i = 0; i < this->length(); i++)
{
message[i] = reverseMessage[i];
}
return message;
}
SmackMyBitchUp 14.12.2011 14:15 # +3
toxicDick
fixed
Steve_Brown 14.12.2011 15:22 # −2
:D
defecate-plusplus 14.12.2011 15:40 # +7
SmackMyBitchUp 14.12.2011 16:08 # −2
Steve_Brown 14.12.2011 16:42 # −1
kipar 14.12.2011 17:03 # +2
Steve_Brown 15.12.2011 09:53 # −2
=D
defecate-plusplus 15.12.2011 12:16 # +1
что ты все смеешься?
ты вообще проверял свой код, велосипедофаг? он точно переворачивает строчку?
тебе же намекнули уже
http://ideone.com/8S78f
Steve_Brown 15.12.2011 13:51 # 0
Lure Of Chaos 14.12.2011 19:22 # 0
ctm 15.12.2011 09:59 # 0
defecate-plusplus 15.12.2011 12:23 # +2
когда "ой ой у тебя же волчанка шаблонный класс, а ты из него хочешь метод вызвать, паника, я щя обосрусь, или напиши this->, или задай мне ключик -fpermissive, чтобы я не обсирался"
но тут причин не вижу, да
guest 17.12.2011 15:42 # 0
defecate-plusplus 17.12.2011 17:03 # +2
мол зависимое имя
guest 17.12.2011 17:10 # 0
defecate-plusplus 17.12.2011 18:11 # +2
как известно, код с шаблонами парсится минимум дважды - в первый раз выявляются независящие от шаблонных параметров вещи, во второй шаблон непосредственно инстанциируется
стандарт в общем то требует чтобы всё, что не зависит от шаблонных параметров, должно быть объявлено/известно на момент первого парсинга кода
гцц облегчает себе жизнь и типа делает в точности, что требуется - вызов метода f() для него выглядит, как независящий от шаблона, поэтому он хочет иметь доступную декларацию уже на момент первого парсинга, и его не интересует, что f() может например быть объявлен в непосредственном предке
собственно такое поведение гцц может приводить к оооочень нетривиальным последствиям - ошибка компиляции с требованием "this->" лишь маленькая неприятность по сравнению с:
http://ideone.com/VaMKR
компилятор вижуал студии имеет другое мнение на этот счет (на счет поиска имен в конкретной точке) и не доставляет таких проблем, он вообще толерантнее гцц к программисту во многих отношениях
TarasB 16.12.2011 09:32 # 0
Неужели до сих пор не придумали опцию компилятора, которая пиздит за new (и за любое выделение ресурса) вне конструктора класса?
defecate-plusplus 16.12.2011 10:48 # 0
достаточно, чтобы выделяемый ресурс знал когда ему умирать
тут компилятор не в силах исправить генетику
TarasB 16.12.2011 14:10 # 0
Оператор = тоже считается.
А, блин, изменение длины для динмассива. Тут я даже не знаю, встроенный реаллок какой-то нужен.
defecate-plusplus 16.12.2011 15:22 # +1
метод reset позволяет установить новый указатель
и т.д. аналогично
выделение ресурсов всегда и только в конструкторах чревато баттхёртом с исключениями
ctm 16.12.2011 11:30 # 0
в принципа можно отследить ту память, указатели на которую хранятся только в локальных переменных, но:
1) можно придумать кучу способов, каждый из которых все испоганит.
2) нафига это вообще делать? если проблемно разработчику следить за локальными, что ж он будет делать с полями класса например?
3) а что, если логика программы по работе с памятью нетривиальна? С++ позволяет реализовать это профессионалу - для этого он и создан.
TarasB 16.12.2011 14:12 # 0
ctm 16.12.2011 14:21 # 0
TarasB 16.12.2011 14:23 # 0
3.14159265 16.12.2011 14:29 # 0
Lure Of Chaos 16.12.2011 14:53 # 0
bugmenot 16.12.2011 15:03 # 0
Lure Of Chaos 16.12.2011 15:06 # 0
TarasB 16.12.2011 15:05 # 0
Если один ресурс выделяется в нескольких местах - то можно один класс на все эти места.
Крестовики любят стебать дальфистов за то, что они руками выделяют ресурсы. Так почему же они считают нормальным писать не исключениебезопасные
a = new A;
delete a;
или безопасные, но муторные
try{
a=new A;
delete a;
} catch (...) {
delete a;
};
?
Это же потенциальная дыра - один раз ошибся и привет. Лучше заткнуть дыру до её возникновения.
Lure Of Chaos 16.12.2011 15:09 # 0
TarasB 16.12.2011 17:35 # 0
И не нужно, потому что есть автодеструкторы.
guest 17.12.2011 12:17 # +1
guest 17.12.2011 12:43 # +1
guest 17.12.2011 12:44 # +1
guest 17.12.2011 12:54 # +1
TarasB 17.12.2011 13:30 # 0
Кулхацкеры, конечно же, негодуют, потому что руки и них из жопы.
Когда-то такое же негодование вызывал запрет тупо преобразовывать int* в float*.
Lure Of Chaos 16.12.2011 15:22 # 0
+ не нужно городить классы
+ фича не строга, поэтому более универсальна
TarasB 16.12.2011 17:34 # 0
Lure Of Chaos 16.12.2011 17:46 # 0
кажись, так и пришли к идее "сборки мусора"
TarasB 16.12.2011 19:55 # 0
Нифига, писать finally вручную - это убого, особенно если объектов много.
> а плодить синтаксическую единицу на каждый чих
Одна единица на каждый тип ресурса. Один раз написал автоудалялку для HGDIOBJECT и пользуйся ей всю жизнь, например. Я ж не заставляю писать по классу на каждый случай использования, лол.
defecate-plusplus 16.12.2011 15:27 # +1
если у тебя было bad_alloc на указателе a, то delete по нему будет пыщьпыщь
> все выделения ресурсов надо заворачивать в классы
используй уже умные указатели, они теперь банановые и в стандарте
привет бустоненавистникам
TarasB 16.12.2011 17:34 # 0
defecate-plusplus 16.12.2011 17:40 # +1
сродни "надо заставить людей выполнять работу в срок" и "надо заставить людей разрабатывать проекты, которые не падают и не текут"
если работник не может, он ищет другое место работы
если у работника по идеологическим причинам есть неприязнь к умным указателям и внимательной работе с ресурсами, то либо работник идиот, либо его начальник мудак, принимающий стратегические решения "мы не будем использовать стл и буст, потому что они тормозят и ниасилили, и вообще С++ говно, но мы будем писать на нём"
TarasB 16.12.2011 19:52 # 0
Потому что то, что ты говоришь - из серии "неприязнь в правильной передаче параметров в функцию" - если бы компилятор за этим не следил, это что же было бы?
defecate-plusplus 16.12.2011 21:29 # +1
хочется реже включать голову, иметь ниже порог вхождения и быстрее писать красиво выглядящие программы - есть другие языки и компиляторы, и интерпретаторы, и сборщики мусора, и формошлёпки, разве кто то кого то заставляет, я не пойму
любой свободно висящий new должен вызывать вопросы прежде всего у программиста, а не компилятора с++ - если программист знает что делает, компилятор лишь должен ему помочь это сделать максимально эффективно
если программист не знает - он зря выбрал опасную бритву
TarasB 16.12.2011 22:10 # +2
Компилятор должен изо всех сил помогать писать безопасный код. А скорость... Это в последнюю очередь оптимизируется, надёжность важнее.
Кстати, какой-то пидор опять поставил мне по минусу, а моим оппонентам - по плюсу. Я передаю ему привет и говорю ему, что он пидор.
bugmenot 16.12.2011 22:36 # +1
Шарль Ожье де Бац де Кастельмор, граф д’Артаньян.
guest 17.12.2011 12:27 # 0
defecate-plusplus 17.12.2011 00:06 # +1
и так старается как умеет
разные долбоёбы не используют смарт пойнтеры потому что "медленные", поэтому выделяют голую память и отдают другому потоку её обрабатывать в надежде, что он её всё таки потрет
компилятор никогда не сможет выловить когда эта память в 99.99% случаев удалится, как задумано, а когда тупо утечет по разным причинам, в т.ч. race condition, поэтому предупреждения он не выдаст - попробуй проанализируй всё это - программист ССЗБ, сэкономил на счетчике ссылок, выбрал неверный инструмент, ему бы розовый дилдо, которым в ногу посложнее выстрелить
поискать утечки памяти в С++ поможет не компилятор, а средства отладки
но если делать сразу хорошо (а С++ этому не препятствует, в отличие от того же С), то валгринд не пригодится никогда
TarasB 17.12.2011 11:47 # 0
Нет, он не заставляет не использовать выделения памяти вне конструктора. Он не защищён от долбоёбов типа отписавшегося ниже. Не надо говорить, что сам виноват - всегда надо искать пути снизить человеческий фактор. То, что ты типа против - можно так же применить к чему угодно, например вообще к автовызову деструктора, и сказать, что раз сам не вызывает деструктор - значит сам себе виноват и нефиг неявные вызовы чего-либо делать. И я уверен, что в начале 80х подобные тебе именно так и говорили про автодеструкторы.
defecate-plusplus 17.12.2011 13:48 # 0
иди в чисто функциональные языки, это там как раз актуально
представь что ты пишешь обычный сервер на С++, ты дождался очередного клиента на сокете и готов от него принимать информацию
большинство протоколов подразумевает чтение из сокета несколько раз, например тот же http - тебе сначала необходимо прочитать сколько-нибудь, пока не станет понятно, сколько конкретно тебе еще требуется прочитать из сокета (например content-length: )
т.е. в общем случае твой класс connection, который пользуется сокетом, должен определенным образом увеличивать память под буфер принятых данных
и конечно он это будет делать не в своем конструкторе и не в конструкторе своего члена buffer
если бы он делал это только в конструторах, ты бы получил pure functional C++, надо дочитать 100 байт к имеющимся 10к - похер, создаем новый объект с длиной 10к+100, копируем старое значение, старый умирает, мы пользуемся новым
я могу привести еще миллион примеров, когда нам надо не в конструкторе выделять память, потому что на этапе конструктора может быть не все известно, и не в каждом экземпляре класса может требоваться выделение памяти
ты путаешь идеологии, С++ никогда не будет что либо запрещать с оператором new, более того, если ты его сам можешь перегрузить любым образом, хочешь свой менеджер кучи пиши со сборщиком мусора
TarasB 17.12.2011 13:52 # 0
Я смягчаю своё предложение - разрешить инициализацию вне конструктора, но только если писать длинное слово, чтобы программист как бы подписывался кровью под договором.
Как я писал ниже, по аналогии с запретом на прямое преобразование типов - там тоже заставляют длинное слово писать.
guest 17.12.2011 15:39 # +1
TarasB 18.12.2011 13:31 # 0
guest 17.12.2011 12:37 # +1
TarasB 17.12.2011 13:25 # 0
guest 17.12.2011 13:37 # 0
lucidfoxGovno 18.12.2011 01:56 # 0
defecate-plusplus 16.12.2011 19:13 # 0
1) пользоваться тем, что большинство этих хендлов суть void *, поэтому отлично работает
единственное неудобство - в shared_ptr нет operator T * (), приходится использовать .get()
2) написать свой универсальный микровелосипед, типа template <class Handle> class scoped_handle;, который бы принимал в конструкторе значение хендла и описание деструктора хендла, в своем деструкторе делал что положено, имел operator Handle () и пару утилитарных методов (типа reset(new_handle), swap и т.д.) - вот сейчас написал такой микровелосипед, получилось всего то 70 строк на него
TarasB 16.12.2011 19:53 # 0
63F45EF45RB65R6VR 17.12.2011 01:22 # −1
в хорошем смысле этого слова зачем же доходить до маразма типа "запретить malloc"
кто как хочет так и программирует мне вот даром не нужны умные указатели
меня тошнит от них да и упраление памятью намного сложнее чем просто выделил
в одном блоке и в нем же освободил вы еще скажите это разработчикам драйверов
и прочего низкоуровневогог кода что они теперь обязаны использовать смартпоинтеры
вот смеху то будет ситуации бывают разные и malloc использую и goto нет если
конечно загонятся по идеологии то тогда все объяснимо почему вы до такого
маразма дошли наверное перечитали умных книжек без фильтрации всего что в них
написано а читать их надо с иронией иначе беда
P.S вообще я очень толерантен к любому мнению но тут увидел ну просто бред
иначе это никак не назовеш
63F45EF45RB65R6VR 17.12.2011 01:36 # −1
они всегда покажут все утечки памяти вместе с каллстеком до самого места выделения
и также прекрасно покажут утечки всех gdi user kernel бъектов а если юзер не
тестит чем нить вроде этого свои проги то он сам себе ССЗБ и никакие умные
указатели тут не помогут
63F45EF45RB65R6VR 17.12.2011 01:45 # −1
вот качаем уже с ключиком и наслаждаемся автоматической и очень удобной багоискалкой
bugmenot 18.12.2011 05:20 # 0
defecate-plusplus 17.12.2011 02:26 # +2
если вы выделяете память в одном методе класса, и ожидаете что она освободится другим методом или в деструкторе, ничего проще scoped_ptr быть не может, оверхеда в нем никакого, а удобство - существенно, т.к. в деструктор вообще ничего писать не приходится
scoped техника также удобна для любого захвата ресурса, необходимого для освобождения
нет ничего проще, чем написать ровно один раз
mutex::scoped_lock lock(mutex);
и знать, что при любом выходе из области видимости (по не одному return или по исключению) он сам освободится
если вы выделяете память и отдаёте попользоваться ею десятку другим параллельным асинхронным операциям, каждая из которых друг о друге ничего знать не хочет, а сами владеть выделенной памятью тоже не собираетесь - она вам не нужна, вам нужна новая область памяти, которую надо отдать другим операциям, shared_ptr решает эту проблему очень и очень просто, объект/память живёт ровно столько, сколько он обязан жить
как бы вас ни тошнило от умных указателей, как бы не был бесполезен многопоточный безопасный код низкоуровневым драйверописателям, как бы не изголялись с передачей в 10 этажные коллбеки сотни хендлов и кусков памяти в расчете, что они останутся живы и тогда, когда коллбек сработает, умные указатели действительно полезны
guest 17.12.2011 03:50 # 0
TarasB 17.12.2011 11:43 # +1
TarasB 17.12.2011 11:42 # +1
Тебе не нужны, а тем, кто пишет приложения, для которых важна надёжность - нужны. Тесты - это хорошо, но их что - ещё и на описатели окон и файлов и всего такого вешать? Ресурсы бывают разные.
> кто как хочет так и программирует мне вот даром не нужны умные указатели
Судя по стилю изложения - это 18-летний кулхацкер, недавно познавший прелести "прямого обращения к памяти", негодует.
guest 17.12.2011 12:00 # 0
вывод: если ты не знаеш то не пиздаболь попусту а то что ты такой
фанат умных указателей говорит только об одном что ты "упопротый"
ну не верю я что человек с опытом будет нести такую
ересь про malloc и что без умных указатей жизни нет
TarasB 17.12.2011 12:08 # +1
ПИЗДЕЕЕЦ
Я думал, тебе 18, в таком возрасте такие мысли и такая орфография - это, можно сказать, нормально.
ЯВАХУЭ
guest 17.12.2011 12:40 # −1
TarasB 17.12.2011 13:28 # 0
guest 17.12.2011 13:32 # −1
guest 17.12.2011 12:48 # −1
последние 10 лет а твое такое мировоззрение на возраст сродни "тупой малолетке"
тебя не красит нет если ты конечно хочеш и дальше ей оставатся то продолжай
будь малолеткой
TarasB 17.12.2011 13:29 # +1
guest 17.12.2011 13:36 # 0
TarasB 17.12.2011 13:39 # 0
У тех пидорков, что пишут гадости на http://huita.org/649 , ничего подобного за душой нету, они неспособны творить, вот и кукарекают.
guest 17.12.2011 13:46 # −2
TarasB 17.12.2011 13:48 # 0
Я сделал игру, которую несколько человек вовсю пиарят без моего ведома, кстати. Казалось бы, что плохого? Это же хорошо, это же достижение? Но ничтожные пидорки обсирают именно меня.
guest 17.12.2011 13:55 # −1
TarasB 17.12.2011 13:58 # 0
guest 17.12.2011 14:01 # −2
TarasB 17.12.2011 14:03 # 0
Скоро кровь потечёт!
Жду очередной порции детских какашек на лурке, в стиле "Тарас хуй и чмо я его ненавижу".
guest 17.12.2011 14:04 # −2
TarasB 17.12.2011 14:05 # −1
guest 17.12.2011 14:03 # −2
TarasB 17.12.2011 14:05 # 0
SmackMyBitchUp 17.12.2011 16:38 # 0
Это хуёво. Ибо отрываются они именно здесь, флудят =(
guest 17.12.2011 12:21 # +1
Убого же.
Лучше так:
Это намного короче, но содержит тотже самый код.
TarasB 17.12.2011 13:28 # 0
Правда, оно тоже содержит new, надо как-то правило нормально формализовать.
Ну и для упоротых можно оставить длинное слово. Типа a=new uncontrolled_resource<A>
По аналогии, как запретили делать преобразование int* к float*, но для упоротых оставили reinterpret_cast, короче, длинное слово, чтобы программист как бы подписывался: "да, я точно знаю, что я имею в виду и беру ответственность на себя".
guest 17.12.2011 14:02 # 0
Что в этом плохого? Можно так:
TarasB 17.12.2011 14:04 # 0
В данном случае как раз ничего.
Вот я и думаю, как бы запретить new так, чтобы в данном случае всё было по закону.
> auto a=std::make_shared<A>();
Ну или оставить только такую инициализацию.
defecate-plusplus 17.12.2011 14:24 # +1
> длинное слово, чтобы программист как бы подписывался
new в нынешнем С++ и есть это слово
прости, что оно недостаточно длинное для тебя
TarasB 17.12.2011 14:34 # 0
Знаешь, когда-то давны-давно все тоже считали, что писать (float*)(&i) достаточно длинно. Но прогресс поставил всё на место.
guest 17.12.2011 15:35 # 0
guest 17.12.2011 16:41 # 0
guest 17.12.2011 19:43 # 0
lucidfoxGovno 18.12.2011 01:56 # −1
Zielscheibe 08.02.2012 12:44 # 0