LINUX.ORG.RU
ФорумTalks

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

 


0

0

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

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

★★★★★

Ответ на: комментарий от FatBastard

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

trex6 ★★★★★
() автор топика
Ответ на: комментарий от FatBastard

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

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

pained
()

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

#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
()
Ответ на: комментарий от pained

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

ucalculus
()
Ответ на: комментарий от Crocodille

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

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

trex6 ★★★★★
() автор топика

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

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

jtootf ★★★★★
()
Ответ на: комментарий от RedPossum

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

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

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

Crocodille
()

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

Sidrian
()
Ответ на: комментарий от trex6

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

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

Crocodille
()
Ответ на: комментарий от jtootf

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

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

Crocodille
()
Ответ на: комментарий от jtootf

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

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

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

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

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

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

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

Crocodille
()
Ответ на: комментарий от Crocodille

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

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

jtootf ★★★★★
()
Ответ на: комментарий от Crocodille

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

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

anonymfus ★★★★
()
Ответ на: комментарий от trex6

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

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

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

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

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

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

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

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

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

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

jtootf ★★★★★
()

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

Yareg ★★★
()

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

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

LeninGad
()

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

urxvt ★★★★★
()
Ответ на: комментарий от LeninGad

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

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

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