- 1
- 2
- 3
- 4
- 5
- 6
std::string response;
...
char* result = new char[response.size() + 1];
memcpy(&result[0], &response.c_str()[0], response.size());
result[response.size()] = 0;
return result;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+16
std::string response;
...
char* result = new char[response.size() + 1];
memcpy(&result[0], &response.c_str()[0], response.size());
result[response.size()] = 0;
return result;
Сам метод возвращает char * (при этом никто не запрещал использовать непосредственно std::string).
ЗЫ жаль что весь проект запостить нельзя. Он весь достоин.
На тот случай, если указатель на массив символов не совпадает с указателем на первый элемент массива. Чтобы познать Дзен, нужно было ещё к void* приведение сделать!
4-5 строки вкупе делают то же, что и strcpy.
UPD: а может и сработает http://ideone.com/4PT7Fs
возможно, это имеет смысл в контексте, как, например, два нолика http запросе
Ээээ. Это фича каких-то виндовых апи для работы с хттп?
А еще в винапишной функции для выбора файла такая фигня была - надо было разделять маски одним ноликом, а в конце поставить два.
Точно! Именно оно :) Сразу всплыл в памяти образ шестого билдера.
а у кого-то он на рабочем столе лежит
а у нас лицензия на работе :-) последний, кто в нем писал, ушел полтора года назад; его говно прикрыли газеткой и обходят за милю :)
я знаю только про два перевода строки после заголовка. Про нолики не в курсе.
А, точно, сам ведь когда-то через телнет баловался. Значит, где-то еще я на это натыкался, вот и обратил внимание.
нет, я просто забыл выделить сарказм зеленым.
>Первый аргумент memcpy тоже без квадратных скобок и амперсанда не работал? :)
А это для симметрии.
Ну может быть автору это надо было передать в какую-нибудь сишную функцию?
Хотя даже если так, то можно было бы хотя бы в std::auto_ptr результат завернуть, чтобы с управлением памятью не париться...
deprecated собственно, как и остальной код афтора
Ты не поверишь, но пока нет. У меня двое друзей работают по крестам в джвух разных конторах, и ни там ни там не разрешено юзать с++11. И что-то мне намекает, что не только у них такие ограничения.
на деле же микрософт так и не осилил стандарт - вот поэтому он и причислен к "экспериментальному"
видать, все силы бросили на очередные революционные фичи виндовс для планшетов
Будем честны, g++ тоже его не допилил: GCC's support for C++11 is still experimental. Хотя, судя по табличке, все фичи окромя GC в g++ реализованы.
Это если у тебя есть с++11 или бустятинку разрешают юзать. А если только хардкорные с++98 - то нифига оно не депрекейтед.
Потому что std::string сдохнет и c_str начнет указывать на освобожденный буфер?
Вернуть c_str() от локальной std::string и ТУТ ЖЕ скопировать в другой std::string, я правильно тебя понял?
Fixed?
Если массив удаляют через delete без [] - то оно в любом случае broken (с педантичной точки зрения, работать то будет).
Поведение не идентичное, об этом выше пишет Xom94ok.
А код из говна становится не говном, только при эквивалентной замене? :)
Не факт, но над неэквивалентной заменой надо сначала 100 раз подумать. Вдруг она что-то поломает в соседнем модуле?
Жопа в том, что не всегда можно его увидеть. А еще большая жопа в том, что говнофичей этого кода могли воспользоваться. Но это в основном либ касается, а не прог.