Имитация простой утечки памяти в Visual Studio с немного запутанным результатом - PullRequest
0 голосов
/ 31 октября 2011

Вот один очень простой вопрос (или, по крайней мере, на первый взгляд). Допустим, у нас есть следующая процедура:

void procedure(void)
{
          int x = new int;
          x=42;
}

Когда я вызываю эту процедуру в моей программе, это должно привести к так называемой утечке памяти, верно? Я сталкивался с такими ошибками при работе над небольшим проектом, а затем компилятор выводил что-то вроде: обнаруженная утечка памяти. блок памяти ... Теперь я пытаюсь смоделировать утечку памяти и посмотреть, что выводит компилятор, но он вообще не жалуется (я использую Visual Studio).
Это действительно утечка памяти, это мой вопрос.

Ответы [ 3 ]

5 голосов
/ 31 октября 2011

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

void procedure(void) { 
    int *x = new int;
    *x = 42;
}

Да, это утечка памяти, о которой я ожидаю, что VC ++ будет жаловаться (при компиляции в режиме отладки). В режиме релиза он все равно обычно не проверяет утечки, но даже если бы он это делал, меня не удивило бы, если бы компилятор обнаружил, что ничего из этого не имело реального эффекта, поэтому вызов его был полностью оптимизирован (таким образом устраняя утечка памяти). Я совсем не уверен, что это произойдет, но это не было бы большим сюрпризом, если бы это произошло.

2 голосов
/ 31 октября 2011

Вы делаете это неправильно Редактировать меня тоже :) Мне нужно сначала научиться читать

вы, вероятно, хотели:

void procedure(void)
{
          int* px = new int;
          *px = 42;
}

, который присваивает значение 42 integer , указанному на на x

И да это действительно (маленькая) утечка памяти.Если функция вызывается много раз, у вас будет большая утечка памяти:)

0 голосов
/ 31 октября 2011

Да, это утечка памяти. Вы используете C ++, и вызов нового оператора зарезервирует 4 байта памяти в куче. - удалить не называется. Если вы вызовете эту функцию 2 миллиона раз, утечка памяти составит около 8 МБ.

В этой короткой части программы - она ​​выделяет память, а указатель преобразуется в int (скрытое преобразование). Некоторые компиляторы могут не обнаружить эту ситуацию, другие могут.

...