이 코드는 유효합니까?"new [1]"로 할당 된 메모리를 "삭제"해도 좋습니까? 그 반대도 마찬가지입니까?
int * a = new int[1];
delete a;
또는이 하나?
int * a = new int;
delete [] a;
분명히, 이것은 바로 보이지 않고 적어도 낙심해야하지만 실제 문제 (메모리 누수 및 기타 등등)을 일으킬 것인가?
이 코드는 유효합니까?"new [1]"로 할당 된 메모리를 "삭제"해도 좋습니까? 그 반대도 마찬가지입니까?
int * a = new int[1];
delete a;
또는이 하나?
int * a = new int;
delete [] a;
분명히, 이것은 바로 보이지 않고 적어도 낙심해야하지만 실제 문제 (메모리 누수 및 기타 등등)을 일으킬 것인가?
매칭 조합 는해야합니다 : - 당신이 섞어 경우
new; delete;
new[]; delete[];
당신은 정의되지 않은 동작을 얻을 것입니다. 나는 이것 때문에 코드가 날아 오는 것을 보았다.
"코드 블로우 업 (blowing code)"에 쓸데없는 퀴즈를 추가 할 수 있다면이 버그는 레드 얼럿 2의 선적 된 버전 (시리즈의 이전 게임에서 남겨진 미사용 기능)에있었습니다. 해당 기능이 활성화 된 경우 게임이 중단되고 IDA 및 WinDBG를 통해 추적하는 것이 재미있었습니다. – DCoder
아니요. new
이면 delete
이어야합니다. new[]
의 경우 delete[]
을 입력해야합니다.
나는 내가 **해야한다고 알고있다. ** 나는 그것을 명시 적으로 썼다. 자기. 내 질문은 이것이 어떤 문제 (그리고 정확히 무엇이 될 것인지)를 유발할 것인지 묻습니다. – NPS
이들을 섞으면 정의되지 않은 동작이 발생합니다. – CoryKramer
힙이 손상되어 크래시가 임의의 지점에서 발생하는 것을 볼 수 있습니다. – sjdowling
스칼라 및 배열 (할당) 할당 연산자를 혼합하면 정의되지 않은 동작이 발생합니다. delete와 delete [] 사이의 정의 된 차이점은 후자가 배열의 모든 요소에 대해 소멸자를 호출한다는 것입니다.
읽기 [올드 새로운 것 - 불일치 스칼라 및 벡터 새로운 및 삭제 (http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx) . – DCoder
'delete '가 어떤 표현식으로도 작동한다면'delete []'를 사용하는 것이 왜 싫은가요? 대답은 '아니오'입니다. 정의되지 않은 동작이 발생하기 때문에 괜찮지 않습니다. – user657267
이것이 문제가 될 메모리 관리자를 쓸 수 있음을 알고 있습니다. 어떤 특정 메모리 관리자/컴파일러가 이것이 문제가 될지 궁금해하십니까? – franji1