- 1
- 2
- 3
- 4
- 5
- 6
CharT getline(std::istream& i, string& s, const CharT* delim) {
...
if (!i.operator void*())
break;
...
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
CharT getline(std::istream& i, string& s, const CharT* delim) {
...
if (!i.operator void*())
break;
...
}
Библиотека Apache UIMA-CPP.
Что могло заставить написать так, вместо обычного if (i)? Какой-то древний компилятор, который не использует каст к указателю в условии?
Ну и, разумеется, в C++11 ios::operator void*() заменили на explicit ios::operator bool(), так что работать перестало.
gost 29.05.2016 21:05 # +1
gost 29.05.2016 21:06 # 0
Bobik 29.05.2016 21:16 # 0
bormand 29.05.2016 21:08 # +3
А как тебе вызов деструктора по названию?
gost 29.05.2016 21:12 # +1
Кстати, а что будет, если потом сделать delete ptr?
bormand 29.05.2016 21:13 # 0
gost 29.05.2016 21:13 # 0
bormand 29.05.2016 21:17 # +2
new ничего нового не выделял, просто прокастовал указатель на buf и вызвал конструктор. По сути, new(buf) SomeClass - просто вызов конструктора на указанном куске памяти.
Antervis 29.05.2016 21:49 # +1
Antervis 29.05.2016 21:39 # 0
bormand 29.05.2016 21:40 # +5
Даже так: освобождение через delete чего-то, что не вернуло new - UB.
kurwa 29.05.2016 23:18 # 0
guestinho 30.05.2016 01:49 # 0
очень может быть что на стеке
просто другого потока например
Antervis 30.05.2016 05:30 # 0
bormand 30.05.2016 07:18 # +3
LispGovno 06.06.2016 18:47 # 0
Bobik 29.05.2016 21:16 # 0
bormand 29.05.2016 21:17 # 0
Antervis 29.05.2016 21:40 # 0
bormand 29.05.2016 21:42 # +4
guesto 29.05.2016 23:01 # +3
3_14dar 29.05.2016 23:09 # 0
guesto 29.05.2016 23:17 # 0
3_14dar 30.05.2016 02:09 # +1
bormand 30.05.2016 07:21 # 0
3_14dar 30.05.2016 19:40 # 0
bormand 30.05.2016 20:06 # +2
guesto 30.05.2016 19:41 # 0
а как?
bormand 30.05.2016 20:05 # +1
guesto 30.05.2016 20:09 # +3
сколько в интеле всего, чем никто не пользуется
3_dar 29.05.2016 23:01 # 0
Bobik 29.05.2016 23:03 # +1
inkanus-gray 29.05.2016 23:07 # +6
Antervis 30.05.2016 05:19 # +2
Dummy00001 30.05.2016 11:18 # +1
на интеле. на всех остальных процах, прога с валится с радостным сообщением о кривом выравнивании адреса. потому что по умолчанию strict alignment проверка включена на большинстве процов (даже арм уже дошёл до уровня имения этого флага).
bormand 30.05.2016 20:08 # 0
Если бы валилось... На арме молча возвращалось "повёрнутое" слово.
inkanus-gray 30.05.2016 13:00 # +1
В общем, копирование данных с адреса, не кратного машинному слову, может быть не реализовано в процессоре физически: просто схема не соберётся. Эмулировать ли это копирование, используя «микрооперации», или отвечать исключением — это дело процессора.
Ситуация осложняется также тем, что размер какого-нибудь типа данных может быть не равен или не кратен машинному слову и мы можем не знать заранее, сколькими инструкциями копирования реализована операция присвоения в конкретном компиляторе или в конкретной библиотеке.
3_14dar 30.05.2016 19:42 # 0
А с чем это связано?
guesto 30.05.2016 19:49 # +2
Например в классическом 8086 проц читал два байта (16 бит, оно же машынное слово). Когда он просил у контроллера памяти считать байты 0x1 и 0x2 то первый попадал в одну часть регистра (например AL) а второй в другую (AH). Соответственно считать машинное слово 0x1 легко.
А вот попробуй считать слово начиная с адреса 0x2 (0x2 и 0x3). Придется сначала считать 0x1 и 0x2, потом 0x2 переложить из AH в AL, затем считать 0x3 0x4, затем откинуть 0x4.
Долго и нудно.
С тех пор много говна утекло, контроллеры памяти теперь читают данные из DIMM сразу по 64 бита, контроллер кеша (который между ядром и контроллером памяти) старается заполнить всю кеш-линейку (которая может быть еще больше), но проблема в целом осталась: если ты читаешь N байт, и перехлестываешь некоторую границу, то читать нужно 2 раза, а не 1. И это усложняет
Steve_Brown 30.05.2016 13:23 # 0
Bobik 30.05.2016 13:35 # 0
Placement delete вроде нет.
Steve_Brown 30.05.2016 14:53 # 0
Placement delete вручную вызвать нельзя.
Он вызывается, если в конструкторе выбрасывается исключение - вызывается delete, соответствующий по сигнатуре использованному оператору new.
guest 31.05.2016 10:07 # 0
Antervis 30.05.2016 14:10 # 0
meinf 30.05.2016 14:24 # 0
использование в контейнерах это частный случай аллокатора так то
Dummy00001 30.05.2016 02:07 # 0
bormand 30.05.2016 07:22 # 0
Antervis 30.05.2016 08:32 # 0
a.operator + <Type>(b)
Хотя, может еще быть operator + (a,b);
Steve_Brown 30.05.2016 12:35 # 0
1024-- 30.05.2016 14:36 # 0
Охлол, это отдельным говнокодом надо как while(x --> 0).
Бедный парсер.
kurwa-nextgen 30.05.2016 16:30 # 0
1024-- 30.05.2016 16:55 # 0
К "a.operator +(b)" вроде уже привык, а такое я ещё не видел и удивился.
Antervis 31.05.2016 14:49 # 0
kurwa 01.06.2016 08:37 # +1
kegdan 01.06.2016 10:15 # +1
Antervis 30.05.2016 20:13 # 0
LispGovno 06.06.2016 18:46 # 0