LINUX.ORG.RU
ФорумTalks

[c]глупые мысли


0

0

Сидел весь день кодил и вдруг меня осенило.
А ведь когда delete или free() особождает память, занятую массивом, он ведь точно знает, сколько памяти необходимо освободить. Значит миф, что нельзя по указателю размер массива узнать. Можно, просто это все скрыто где-то в реализации free/delete

Вобщем такие вот мысли.
Думаюв в толксах им самое место.

★★★★★

Ответ на: [c]глупые мысли от FatBastard

[c]глупые мысли

Это точно вряд ли. Какая бы комбинация за NULL не принималась, она все равно может встретится внутри массива произвольного типа с произвольными данными.
К тому же если это действительно так - можно и самим до NULL отсматривать, ну а потом поделив на размер элемента узнать длинну массива.

trex6 ★★★★★ ()
Ответ на: [c]глупые мысли от FatBastard

[c]глупые мысли

а ещё две звёздочки. Вообще-то функция malloc при выделении создает структуру, в которой хранит указатель и размер области, и ложит её в свою заначку. При освобождении free находит эту структуру, и поэтому знает что и как освобождать.

Вобщем, нельзя по указателю размер массива узнать, потому что указатель куда хочешь указывать может.

pained ()

[c]глупые мысли

Внимание вапрос - что выведет программа:

#include <stdio.h>

int main()
{
   int * array = new int[122]
   int length = *(array - 1);
   printf( "%d\n", length/sizeof(int) );
   delete[] array;
}
P.S. учи матчасть

Crocodille ()
Ответ на: [c]глупые мысли от pained

[c]глупые мысли

Количество звезд как бы не коррелирует с объемом знаний в той или иной области.

ucalculus ()

[c]глупые мысли

И я даже представить боюсь, что можно накодить, если даже не знать разницу между free и delete/delete[]

Crocodille ()
Ответ на: [c]глупые мысли от RedPossum

[c]глупые мысли

компилировал (интерпритировал?) на codepad.org

RedPossum ★★★★★ ()
Ответ на: [c]глупые мысли от Crocodille

[c]глупые мысли

>И я даже представить боюсь, что можно накодить, если даже не знать разницу между free и delete/delete[]

А кто сказал, что я не знаю?

trex6 ★★★★★ ()

[c]глупые мысли

просто это все скрыто где-то в реализации free/delete

тебе лень просто заглянуть в исходники? обязательно надо задать глупый вопрос в толксах?

jtootf ★★★★★ ()
Ответ на: [c]глупые мысли от RedPossum

[c]глупые мысли

> и что же вывела программа?

ерунду ) сори, пример не корректный.

Borland C++ записывал по отрицательному смещению длину массива. В современных компиляторах используется механизм описанный FatBastard.

Crocodille ()

[c]глупые мысли

Я сначала испугался что это я случайно на быдлохабр забрел, но нет, таки к сожалению на ЛОР, который уже совсем не торт...

Sidrian ()
Ответ на: [c]глупые мысли от trex6

[c]глупые мысли

> А кто сказал, что я не знаю?

я такого, не утверждал, но сам пост как бы подразумевает.

Crocodille ()
Ответ на: [c]глупые мысли от jtootf

[c]глупые мысли

> тебе лень просто заглянуть в исходники? обязательно надо задать глупый вопрос в толксах?

Мне всегда казалось, что толксы как раз созданы для глупых вопросов и достойных им ответов

Crocodille ()
Ответ на: [c]глупые мысли от jtootf

[c]глупые мысли

>тебе лень просто заглянуть в исходники? обязательно надо задать глупый вопрос в толксах?

Да не лень мне в исходники заглядывать.
Просто незачем. Уже давным давно привык сохранять длинну массива.

Интересно другое. На многих форумах как только возникает вопрос «Как узнать длинну массива в C/C++ во время выполнения программы?» сразу же появляется много-много умников, которые утверждают что это 100% невозможно. А, оказывается, возможно. И я очень сильно сомневаюсь, что это метод, описанный FatBastard.

Ну и последнее. Мне просто мозги расслабить захотелось и поговорить ни о чем. Вот в толксы и выложил. Если бы хотелось действительно серьезный ответ услышать - отправил бы в Development.

trex6 ★★★★★ ()
Ответ на: [c]глупые мысли от trex6

[c]глупые мысли

> Интересно другое. На многих форумах как только возникает вопрос «Как узнать длинну массива в C/C++ во время выполнения программы?» сразу же появляется много-много умников, которые утверждают что это 100% невозможно. А, оказывается, возможно. И я очень сильно сомневаюсь, что это метод, описанный FatBastard.

В общем случае (для абстрактного C/C++) это узнать не возможно. Но зная подробности реализации конкретного компилятора - можно вполне.

Crocodille ()
Ответ на: [c]глупые мысли от Crocodille

[c]глупые мысли

Мне всегда казалось, что толксы как раз созданы для глупых вопросов и достойных им ответов

ну, формально - нет

jtootf ★★★★★ ()
Ответ на: [c]глупые мысли от Crocodille

[c]глупые мысли

>Borland C++ записывал по отрицательному смещению длину массива.

Это что, такая извращённая совместимость со строками в Pascal и Delphi?

anonymfus ★★★★ ()
Ответ на: [c]глупые мысли от trex6

[c]глупые мысли

А, оказывается, возможно. И я очень сильно сомневаюсь, что это метод, описанный FatBastard.

это, понимаешь ли, платформозависимо - общего метода нет и быть не может

много-много умников, которые утверждают что это 100% невозможно

правильно всё говорят

jtootf ★★★★★ ()
Ответ на: [c]глупые мысли от jtootf

[c]глупые мысли

>правильно всё говорят

когда мне будет далеко за 60 я сяду с бокалом чего-нибудь горячительного у камина и с удовольствием накрапаю библиотечку под все компиляторы и под все оси. И тогда тучи разойдутся и душа моя спокойно отойдет в рай. =) ;-)

Всем принявшим участие в обсуждении спасибо.
Предлагается расценивать этот тред как лишь очередную шутку.

trex6 ★★★★★ ()
Ответ на: [c]глупые мысли от trex6

[c]глупые мысли

с удовольствием накрапаю библиотечку под все компиляторы и под все оси

под все версии libc тогда уж, но даже так не очень хорошо получится - есть ещё и просто отладочные/специализированные версии *alloc. в общем, тебя ждёт нескучная старость :)

jtootf ★★★★★ ()

[c]глупые мысли

Если это не указатель, созданный маллоком, а к примеру, указатель на середину массива, то даже такая теоретическая возможность работать не будет.

Yareg ★★★ ()

[c]глупые мысли

В glibc есть malloc_usable_size, который возвращает размер, известный malloc()/free(). Засада лишь в том, что это в общем случае не тот размер. Malloc может выделить больше, чем запрошено, и (предупреждение для пофигистов) реально так делает.

А вот new[] сохраняет уже настоящий размер. Так что в C++ совершенно зря нету переносимого способа его узнать. Но переносимого способа таки нету.

LeninGad ()

[c]глупые мысли

Походу единственный обязательный выделятор памяти только тот что в ядре, и только ядро знает размер выделенного куска. Но просто glibc, например, может поверх ядренного реализовывать свой выделятор, а программа может еще и свой поверх иметь. Так что тут все зависит от конкретной ситуации.
И даже если в С++ есть своя прослойка (я думаю есть) то это ничем не поможет, ибо ее реализаци/наявность будет зависеть от компилятора, влагов компиляции и фаз Луны.

urxvt ★★★★★ ()
Ответ на: [c]глупые мысли от LeninGad

[c]глупые мысли

> Так что в C++ совершенно зря нету переносимого способа его узнать

и хорошо, что нет

lester ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.