- 1
- 2
- 3
char* szOwnedData = reinterpret_cast <char*> (m_bOwner && szData != NULL ?
realloc (szData, nLength + 1) :
malloc (nLength + 1));
phpBidlokoder2 13.04.2020 23:34 # 0
666_N33D135 14.04.2020 12:53 # 0
666_N33D135 14.04.2020 12:54 # 0
1024-- 14.04.2020 15:35 # 0
1. szData и szOwnedData - две разных переменных, после неудачного realloc szData никуда не утечёт.
2. из условия можно убрать szData != NULL и покормить realloc нулями, но всё равно из-за m_bOwner тернарник никуда не уйдёт.
3. питушки кукарекают из-за malloc/realloc/free? А какие альтернативы? И какие проблемы, если эта питушня инкапсулирована в классе?
4. или дело в nLength + 1? Ну то есть szData был nLength, а тут к нему прихерачивают ещё один байт вместо православного увеличения в два раза? Но для того, чтобы это подтвердить, не хватает контекста.
Вывод: данный кусок - не говно.
gostinho 14.04.2020 15:40 # 0
P.S. Какой оналог realloc в плюсах?
1024-- 14.04.2020 15:45 # 0
guest8 14.04.2020 15:49 # −999
gostinho 14.04.2020 15:51 # 0
guest8 14.04.2020 15:53 # −999
gostinho 14.04.2020 16:04 # 0
Нужно увеличить питуха в 2 раза.
guest8 14.04.2020 16:11 # −999
OCETuHCKuu_nemyx 14.04.2020 16:20 # 0
guest8 14.04.2020 16:33 # −999
gost 14.04.2020 18:46 # 0
Именно для этого придумали «std::vector::data()».
bormand 14.04.2020 20:26 # 0
gost 14.04.2020 21:22 # 0
3.14159265 14.04.2020 21:53 # +2
Не ты аллоцировал — не тебе освобождать.
gost 14.04.2020 22:25 # +1
guest8 14.04.2020 22:58 # −999
gostinho 14.04.2020 22:59 # 0
guest8 14.04.2020 23:03 # −999
gostinho 14.04.2020 23:10 # 0
guest8 14.04.2020 23:15 # −999
gost 14.04.2020 23:49 # 0
#песни
3.14159265 15.04.2020 00:50 # +3
Ты освобождал, где не аллочил, и собирал, где не рассыпал; посему надлежало тебе отдать память мою немедля.
И я, придя, получил бы моё.
Ибо всякому освобождающему дастся и приумножится, а у занимающего отнимется и то, что имеет.
А негодному отбросу дайте скриптуху: там будет плач и скрежет зубов.
gostinho 15.04.2020 00:58 # −2
3.14159265 15.04.2020 01:05 # +4
И соберутся пред Ним все кодеры; и отделит одних от других, как пастырь отделяет бояр от скриптухов; и поставит бояр по правую сторону, а биомусор — по левую.
Тогда скажет и тем, которые по левую сторону: идите от Меня, проклятые, в огонь вечный, уготованный скриптухою
Ибо Я был на хабре, и заминусовали Меня; был на ЛОРе, и забанили Меня; был на ГК и смеялись надо Мной; был в блоге, и не посетили Меня.
И сольются сии в хламину вечную, а блаженные праведники в Сишку вечную.
Тогда скажет Царь тем, которые по правую сторону Его: придите, благословенные, наследуйте Царство, уготованное вам от создания Сишки.
И Царь скажет им в ответ: истинно говорю вам: так как вы сделали это одному из сих бояр Моих меньших, то сделали Мне.
gostinho 15.04.2020 01:18 # 0
1024-- 14.04.2020 15:51 # 0
Rooster 15.04.2020 06:27 # 0
Например у вектора resize.
gostinho 15.04.2020 11:24 # 0
1024-- 15.04.2020 11:30 # 0
Перейти на другую архитектуру, где указатели шире/уже.
666_N33D135 15.04.2020 17:16 # 0
Да и sizeof(укоззатель) же в конпайл тайме же работает же, как ты ево ресайзнуть собираешься? Регистры программно расширять чтоли умеешь?
gostinho 15.04.2020 17:19 # 0
есть
pituh1 = (int*)malloc(100500*sizeof(int))
есть
pituh2 = new int[100500]
есть
realloc(pituh1, 2001000*sizeof(int))
как c pituh2 сделать?
Вопрос понятен?
666_N33D135 15.04.2020 17:23 # 0
Почему он не может быть вектором, массивом, строкой и тюпю?
gostinho 15.04.2020 17:24 # 0
guest8 15.04.2020 17:31 # −999
bormand 15.04.2020 18:08 # +2
Помнится, в делфи и сибилдере можно было ресайзить массив. И что в итоге? Макаки умудрились нахуевертить Алгоритм Шлемиэля почти в каждой проге. С вектором это сделать сложнее, он не реаллочится на каждый чих.
nblXOMAKAKA 15.04.2020 18:12 # 0
Needless 15.04.2020 18:21 # 0
Мы там про демонические массивы ничего не знали, у нас всё сатаничесоке былдо.
А ещё нам про джвухмерные матрицы ничего не рассказывали, представляете, как я заебался, когда в первый раз пытался напесать крыстики-нолики?
guest8 15.04.2020 18:25 # −999
gostinho 15.04.2020 18:13 # +2
Я теоретическую возможность спрашиваю.
Вектор же как-то реаллочит свои кишки внутри?
BECEHHuu_nemyx 15.04.2020 18:17 # 0
Если делаешь new int[] или malloc, выделяется непрерывный кусок памяти. Если нет свободного места, чтобы его реаллочить на месте, приходится выделять новый кусок памяти, копировать туда все элементы, потом удалять старый кусок.
std::vector не обязан размещаться в непрерывном куске памяти. Доступ к его элементам не по сишному указателю с арифметикой, а через перегруженный оператор []. Чтобы реаллочить std::vector, не нужно выполнять пердолинг из предыдущего абзаца, достаточно выделить в произвольном месте памяти блок для новых элементов. Перегруженный оператор [] автоматически направит тебя на старый или на новый блок.
Верно или я нафантазировал?
bormand 15.04.2020 18:20 # +1
BECEHHuu_nemyx 15.04.2020 18:21 # 0
bormand 15.04.2020 18:22 # +3
BECEHHuu_nemyx 15.04.2020 18:24 # 0
А у new int[] вся выделенная память задействована, поэтому для добавления даже одного элемента нужно делать полный реаллок.
gostinho 15.04.2020 18:21 # +1
Лол што? Он тоже создаст новый кусок, и удалит старый. Но я думаю он позовёт realloc или его аналог.
bormand 15.04.2020 18:27 # +1
gostinho 15.04.2020 18:29 # 0
bormand 15.04.2020 18:30 # 0
gostinho 15.04.2020 18:31 # 0
gostinho 15.04.2020 18:30 # +1
BECEHHuu_nemyx 15.04.2020 18:31 # 0
BECEHHuu_nemyx 15.04.2020 18:34 # 0
bormand 15.04.2020 18:37 # 0
А он тут не поможет, память же облапали.
BECEHHuu_nemyx 15.04.2020 18:38 # 0
bormand 15.04.2020 18:36 # 0
А это очень редко работает, на самом деле. Особенно в многопоточной проге.
Ну и у вектора есть reserve() если ты примерно знаешь сколько в нём будет элементов и хочешь чтобы он лишний раз не реаллочился.
0_14sun 15.04.2020 22:04 # 0
3.14159265 15.04.2020 21:11 # +2
>даже если можно расширить текущий кусок памяти
В других языках типа Йажи, те же проблембы. Разве что gc память дефрагментирует. Но всё равно перепитушня.
> я думаю он позовёт realloc или его аналог.
Вот в С++42 допилят move-семантику моей мечты для нетривиальных конструкторов. И она будет делать realloc, схлопывать new+delete, превращать воду в вино и творить прочие чудеса.
BECEHHuu_nemyx 15.04.2020 18:30 # 0
bormand 15.04.2020 18:31 # 0
guest8 15.04.2020 18:34 # −999
Needless 15.04.2020 18:33 # 0
1024-- 15.04.2020 20:13 # +1
1. выделить новый кусок
2. если новый кусок выделен (не NULL) и не равен старому (расширение), удалить старый
Тогда между этими этапами в случае, если новый кусок выделен и не равен старому, можно использовать placement питушню. И всё как надо будет.
bormand 15.04.2020 18:19 # +1
Вектор всё равно не смог бы юзать такой массив в качестве бекенда. Ему ещё capacity надо, а не только size. Так что это просто бесполезный атавизм от первых версий крестов.
bormand 15.04.2020 18:23 # 0
Ну а что ещё сказать, если это ненужный атавизм от первых версий крестов, у которых ещё вектора не было?
Needless 15.04.2020 18:25 # 0
bormand 15.04.2020 18:26 # 0
Needless 15.04.2020 18:30 # 0
Needless 15.04.2020 18:23 # 0
ЗЫ. Ты мудак, зачем тебе это нужно. Зачем? Зачем?
guest8 15.04.2020 18:22 # −999
guest8 15.04.2020 18:29 # −999
bormand 15.04.2020 18:33 # +1
guest8 15.04.2020 18:52 # −999
gost 14.04.2020 18:46 # +1
666_N33D135 15.04.2020 17:16 # 0
phpBidlokoder2 15.04.2020 18:03 # 0
Needless 15.04.2020 18:18 # 0
Отвечаю на комент твой.