2013-10-11 4 views
1

Так что мне было интересно, что произойдет, если я поставлю '\ 0' в середине памяти malloc.Возможно ли утечка памяти вручную?

Я столкнулся с этим вопросом. Memory Leak when freeing a char array

В ответе Джесси Гуда говорится, что эта строка напечатает размер памяти «malloc».

std::cout << *((std::size_t*)arr - 1) << std::endl; 

Означает ли это, если я изменить значение ((Std :: size_t) обр - 1), размер памяти, который будет освобожден, когда я называю «бесплатно» будет отличаться и причина утечка памяти, если измененное значение меньше исходного значения?

+1

"** возможно распечатать **" и "** может вызвать утечку памяти **". Это зависящее от реализации поведение, прочитайте реализацию стандартной библиотеки malloc, чтобы узнать, как она освобождает память. Не зная, какой из них вы используете, любой ответ будет предположением. – Thomas

+2

№ Ответ: [в теме, на которую вы ссылаетесь] (http://stackoverflow.com/a/17417163/2633423). Короче говоря: 'free' знает размер блока памяти, который он собирается освободить, предполагая, что вы передаете ему указатель на блок, полученный из' malloc' (в противном случае у вас есть неопределенное поведение). –

+4

Вы используете недокументированную функцию, и тем самым вы вызываете неопределенное поведение. Ваша программа могла бы работать, могла бы потерпеть крах, или это может пробудить Ктулху. Ничего не гарантировано. – SigTerm

ответ

6

Ответ, на который вы говорите, вводит в заблуждение. Прочтите принятый ответ.

Это правда, что если ваша система использует определенные распределители памяти, можно узнать значение size_t, предшествующее блоку памяти, для определения размера этого блока. Однако:

  • Не все распределители памяти работают таким образом. Некоторые будут хранить другие значения в этом месте, такие как указатели на другие блоки памяти, а некоторые не используют его ни для чего, что будет иметь для вас значение.
  • Результаты чтения памяти вне выделенного блока: undefined. В некоторых случаях адрес, предшествующий выделенному блоку, может находиться вне пространства памяти вашего процесса, и доступ к нему приведет к segfault.
  • Изменение этого значения, скорее всего, приведет к повреждению состояния распределителя памяти и приведет к неправильной работе и/или сбою вашей программы при распределении или освобождении памяти.

Не читайте и не записывайте память за пределы выделенных областей.

+0

Я вижу. Это понятно. Большое спасибо! – whiteSkar

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