![]() |
|
|
![]()
|
|
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Можно ли так сделать?
Если через малок, то согласен ничего не освободится, а если просто обьявить. То да, все будет в куче, но по выходе из функции этот участок, будет отмечен как свободный, по этому гарантировать, что в том месте будет нужная информация нельзя. Что это было???? Участок в "куче" может быть отмечен как "свободный" только в двумя способами - функцей free или командой delete. Это сообщение отредактировал(а) Alca - 5.5.2008, 11:44 |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Что-то мне подсказывает, что уже при strcpy может вылететь segfault. Ведь под pszResult у тебя зарезервирован всего-лишь 1 байт (для \0), а ты туда "My_String" скидываешь. Есть шанс затереть что-нить нужное, или просто влезть в чужую память, за что получишь по рукам от операционки.
Добавлено @ 11:54 Вот если сделать
то из-за static результат будет доступен и после выхода из области видимости функции. Но будут проблемы при многопоточности, нужно или синхронизацию вводить, или переписать всё нафик по другому. Это сообщение отредактировал(а) EnergoHokum - 5.5.2008, 11:57 |
|||
|
||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
stack corruption Добавлено через 10 минут и 28 секунд
а будет следующее вызов strcpy - не приведет к segfault, так как произойдет обращение к памяти в стэке, причем будет перезаписана часть стека и возвращаемый указатель будет указывать на начало этой области. далее, при попытке использовать этот указатель для чтения, очень велика вероятность получить мусор по этому указателю, так как эта область памяти будет перезаписана программой, туда будут записаны параметры функций, которые будут вызваны после pszFunc и их адреса возврата, если-же ты попытаешься изменить эту строку, то получишь stack corruption. мне просто интересно, какие религиозные убеждения мешают использовать std::string(vector) или в случае Builder-a - AnsiString? |
||||||
|
|||||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Скорость выполнения кода + совместимость с Visual C++ (AnsiString). Это сообщение отредактировал(а) Alca - 5.5.2008, 12:31 |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
скорость выполнения кода больше не станет, скорее наоборот, так как std::string может реализовывать разные оптимизации, например для коротких строк память может не выделяться или может использоваться механизм copy on write. В любом случае корректную программу сделать быстрой намного проще чем быструю корректной Добавлено через 3 минуты и 59 секунд я думаю основная идея твоего кода такова:
но работать все равно не будет, так как строка размещается локально и при выходе из функции затрется, а из-за того, что возвращаемый указатель, не константный, может произойти повреждение стека (компилятор будет не против если ты туда что-нибудь запишешь) Добавлено через 8 минут и 59 секунд
в этом коде произойдет только одно выделение памяти - при создании строки память под строку выделиться в куче (где ей самое место), когда ф-я возвратит строку по значению копирования не произойдет, будет скопирован только объект Result копия которого получит указатель на массив в куче, содержащий строку "My_String" |
||||
|
|||||
| mrbrooks |
|
||||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Тогда может вообще так:
|
||||||
|
|||||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Тест на конкатенацию строк: (тестировал ф-ей GetThreadTimes)
Результат тестирования: [12:43:35:500] 00:00:07:046 <--- char [12:44:20:00] 00:00:38:093 <--- AnsiString [12:45:28:953] 00:01:00:718 <--- std::string Это сообщение отредактировал(а) Alca - 5.5.2008, 12:59 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
этот тест не совсем корректный, так как в случае char ты не обрабатываешь возможность переполнения буфера
под переменную pcRes выделено столько памяти, сколько нужно - заранее. в реальном приложении, работая с большим количеством строк, ты вряд-ли будешь знать сколько выделить под них памяти что-бы так-же уютно их сложить. к тому-же strcat можно использовать и с std::string (и даже с std::vector |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
проверь для случая 2х объединяемых строк, разница будет мало заметна. в этом коде память будет выделяться 5 раз - под промежуточные результаты, и ты это сравниваешь с кодом в котором строки размещаются в стэке!!! в реальных приложениях приходится работать со строками размещенными в динамической памяти, и оч. редко приходится объединять сразу много строк (хотя в этом случае легко заставить код работать быстро, просто нужно работать со строкой напрямую а не через операторы) |
|||
|
||||
| Rififi |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 1 Всего: 36 |
ради интереса прогнал тот же тест
VS2008, Release Опции оптимизации: ![]() код программы:
вывод (время в секундах):
Добавлено через 6 минут и 58 секунд а теперь создадим невыгодные условия для raw_char :gigi:
результат:
|
||||||||
|
|||||||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Добавлено через 3 минуты и 14 секунд Блин, это был debug исправляюсь, вот relise
что и требовалось доказать |
||||||
|
|||||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
sRes.append() -
Уговорили. AnsiString нервно курит в сторонке...
Результат теста:
Это сообщение отредактировал(а) Alca - 5.5.2008, 18:29 |
||||
|
|||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |