2014-10-16 13 views
-4

이 코드는 유효합니까?"new [1]"로 할당 된 메모리를 "삭제"해도 좋습니까? 그 반대도 마찬가지입니까?

int * a = new int[1]; 
delete a; 

또는이 하나?

int * a = new int; 
delete [] a; 

분명히, 이것은 바로 보이지 않고 적어도 낙심해야하지만 실제 문제 (메모리 누수 및 기타 등등)을 일으킬 것인가?

+2

읽기 [올드 새로운 것 - 불일치 스칼라 및 벡터 새로운 및 삭제 (http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx) . – DCoder

+6

'delete '가 어떤 표현식으로도 작동한다면'delete []'를 사용하는 것이 왜 싫은가요? 대답은 '아니오'입니다. 정의되지 않은 동작이 발생하기 때문에 괜찮지 않습니다. – user657267

+0

이것이 문제가 될 메모리 관리자를 쓸 수 있음을 알고 있습니다. 어떤 특정 메모리 관리자/컴파일러가 이것이 문제가 될지 궁금해하십니까? – franji1

답변

5

매칭 조합 해야합니다 : - 당신이 섞어 경우

new; delete;

new[]; delete[];

당신은 정의되지 않은 동작을 얻을 것입니다. 나는 이것 때문에 코드가 날아 오는 것을 보았다.

+0

"코드 블로우 업 (blowing code)"에 쓸데없는 퀴즈를 추가 할 수 있다면이 버그는 레드 얼럿 2의 선적 된 버전 (시리즈의 이전 게임에서 남겨진 미사용 기능)에있었습니다. 해당 기능이 활성화 된 경우 게임이 중단되고 IDA 및 WinDBG를 통해 추적하는 것이 재미있었습니다. – DCoder

0

아니요. new이면 delete이어야합니다. new[]의 경우 delete[]을 입력해야합니다.

+1

나는 내가 **해야한다고 알고있다. ** 나는 그것을 명시 적으로 썼다. 자기. 내 질문은 이것이 어떤 문제 (그리고 정확히 무엇이 될 것인지)를 유발할 것인지 묻습니다. – NPS

+0

이들을 섞으면 정의되지 않은 동작이 발생합니다. – CoryKramer

+0

힙이 손상되어 크래시가 임의의 지점에서 발생하는 것을 볼 수 있습니다. – sjdowling