2013-12-08 2 views
0

У меня есть некоторый код, который создает динамически выделяемый массив сПочему мой динамически выделенный массив получает инициализацию до 0?

int *Array = new int[size]; 

Из того, что я понимаю, массив должен быть указателем на первый элемент массива в памяти. При использовании gdb я могу вызвать x Array для проверки значения в первой ячейке памяти, x Array + 1, чтобы исследовать вторую и т. Д. Я ожидаю, что значения нежелательных эффектов остались бы от любого приложения, использующего эти пятна в памяти до моего , Однако использование x Array возвращает 0x00000000 для всех этих мест. Что я делаю не так? Мой код инициализирует все значения массива до нуля?

EDIT: Для записи я прошу, потому что моя программа является попыткой реализовать это: http://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time/. Я хочу удостовериться, что мой алгоритм не увеличивается с помощью массива, чтобы инициализировать каждый элемент до 0.

+2

Вы не можете положиться на это поведение, это UB! –

+0

Вы можете написать 'int * Array = new int [size]();' (обратите внимание на пустую скользящую скобку), если вы хотите, чтобы эти нули были гарантированы. – fredoverflow

ответ

3

В большинстве современных ОС ОС предоставляет обнуленные страницы приложениям, а не позволяет передавать информацию между несвязанными процессами. Это важно, например, по соображениям безопасности. Назад в старые дни DOS, вещи были немного более случайными. Сегодня, с защищенными памятью операционными системами, ОС обычно дает вам нули для начала.

Итак, если этот new происходит в начале вашей программы, вы, вероятно, получите нули. Вы были бы сумасшедшими, чтобы полагаться на это, хотя; это неопределенное поведение, если вы это сделаете.

Если вы продолжаете выделять, заполнять и освобождать память, в конечном итоге new вернет память, которая не обнуляется. Скорее, он будет содержать остатки вашего собственного «более раннего написания» вашего процесса.

И есть нет гарантии, что любой конкретный вызов new, даже в начале вашей программы, вернет память, заполненную нулями. Вы просто , вероятно,, чтобы увидеть, что для звонков new в начале вашей программы. Не позволяйте этому вводить вас в заблуждение.

1

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

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

И, действительно, «те пятна» - довольно свободный термин, данный виртуальная адресация.

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

+0

В современной операционной системе VM я был бы очень разочарован, если бы он позволил мне увидеть забытую память других задач волей-неволей, если бы я не сделал что-то гораздо менее пешеходное, чем простое «новое». –

+0

@JoeZ Ожидайте его во время выполнения с (повторными) выделениями ... –

+0

@ g-makulik: Я ожидаю, что нежелательные сообщения из одного приложения; Я просто указывал с виртуальной памятью в современной VM OS, вы не должны ожидать появления нежелательной почты от любых других приложений. (Комментарий «Эти пятна».) –

Смежные вопросы