Можно создать дубликат:
How could pairing new[] with delete possibly lead to memory leak only?удаление массиву неправильного пути
Я всегда говорил, что это не безопасно для вызова удалять на массиве, наделенном новое []. Вы всегда должны сочетать новые с delete и new [] с delete [].
Так что я был удивлен, обнаружив, что следующий код компилируется и работает нормально, как в режиме отладки, так и в режиме Release под VS2008.
class CBlah
{
public:
CBlah() : m_i(0) {}
private:
int m_i;
};
int _tmain(int argc, _TCHAR* argv[])
{
for(;;)
{
CBlah * p = new CBlah[1000]; // with []
delete p; // no []
}
return 0;
}
Это мне потребовалось некоторое время, чтобы выяснить, почему это работает на всех, и я думаю, что это просто везение, а некоторые неопределенное поведение.
BUT ... это заставило меня задуматься ... почему Visual Studio не забирает это, по крайней мере, в диспетчере памяти Debug? Это потому, что есть много кода, который делает эту ошибку, и они не хотят ее нарушать, или они чувствуют, что задача менеджера памяти Debug не в том, чтобы поймать такую ошибку?
Любые мысли? Является ли это распространенным распространением?
Это логическая ошибка, которая не может быть обнаружена компиляторами. Однако хорошие IDE могли бы выявить эти. – jwueller
Этот вопрос http://stackoverflow.com/questions/1913343/how-could-pairing-new-with-delete-possible-lead-to-memory-leak-only подробно объясняет все детали. И да, это типичная ошибка. – sharptooth
@Hans Passant: Нет, массив не просочился, это UB. Я связался с вопросом, который подробно объясняет всю внутреннюю работу. – sharptooth