답변
BYTE* data = new BYTE[size];
은 주어진 어떤 크기, 반환 된 메모리 영역은 연속입니다. 힙 관리자가 size
의 연속 메모리를 할당 할 수 없으면 실패합니다. 예외 (또는 malloc
의 NULL)가 리턴됩니다.
프로그래머는 프로세스의 주소 공간에 항상 연속적인 (예, 무한대 :-) 메모리가 있다는 환상을 보게됩니다. 이것은 가상 메모리가 프로그래머에게 제공하는 것입니다.
프로그래머 (일부 임베디드 시스템 제외)는 항상 가상 메모리를 볼 수 있습니다. 그러나 사실상 연속적인 메모리는 임의의 방식으로 물리적 메모리에 매핑 될 수 있습니다 (일반적으로 4KB 인 '페이지'크기의 세분성). 이 매핑은 볼 수 없으며 대부분 특정 페이지 수준의 최적화를 제외하고는 이해할 필요가 없습니다.
어떨까요?
BYTE* data1 = new BYTE[size1];
BYTE* data2 = new BYTE[size2];
물론, 당신은 data1
및 data2
의 상대 주소를 말할 수 없습니다. 일반적으로 비 결정적입니다. 요청이있을 때 힙 관리자 (예 : malloc
, new
은 방금 malloc
으로 바뀜) 정책과 현재 힙 상태에 따라 다릅니다.
프로세스의 주소 공간에 할당 된 메모리의 연속이 될 것입니다 ... 나는 하나 개의 새로운 작업에 의해 할당 된 메모리가 연속인지, C++로 알고 싶어했다.
이러한 바이트가 실제 메모리에 매핑되는 방식은 구현에 따라 다릅니다. 매우 큰 메모리 블록을 할당하면 실제 메모리의 다른 부분에 매핑 될 가능성이 있습니다.
편집 : 누군가가 바이트가 연속으로 보장되는 것을 동의하기 때문에는 표준 말한다 (3.7.3.1) :
할당 기능은 스토리지의 요구 금액을 할당하려고 시도합니다. 성공적이면, 바이트 단위의 길이가 요청 된 크기 이상이어야하는 저장 블록의 시작 주소를 리턴해야한다. 이 코드에서
할당 된 바이트의 가상 주소는 연속적입니다. 또한 프로세스의 주소 공간을 뒷받침하는 상주 페이지 내에서 물리적으로 연속적입니다. 물리적 페이지를 프로세스 가상 공간의 영역에 매핑하는 것은 OS와 플랫폼에 따라 다르지만 일반적으로 물리적으로 인접한 범위를 페이지에 더 크게 또는 정렬하지 않을 수 없습니다.
사례 1 : "새로운"배열을 할당하여이 경우
int* foo = new int[10];
같이 foo를
각 요소 연속 가상 메모리에있을 것이다.
사례 2 :이 경우
int* foo = new int;
int* bar = new int;
같이 , 비 원자 연속 "새로운"작업을 사용하여이 호출 사이에 할당 된 메모리에 인접한 "새로운"될 것입니다 수 있다는 보장이 결코 가상 메모리.
예.
"가상 메모리"문제에 대해 신경 쓰지 마십시오. 가상 메모리를 지원하는 시스템이 전혀없는 경우가 있습니다. PoV에서 연속적인 메모리 청크가 발생합니다. 그게 다야.
질문에 "연속적으로 new() 연산이 인접한 메모리 덩어리를 사이에 끼우지 않고 반환하겠습니까?"라고 말하면이 오래된 프로그래머는 매우 정중하게 말하면 그것.
유일한 질문은 하나의 데이터 객체에서 "out"포인터를 걷고 다음 데이터 객체에서 "into"로 포인터를 이동하려는 경우입니다. 주소 공간에있는 다음 객체가 이전 객체와 동일한 유형과 원격으로 유사한 객체라는 보장이 없기 때문에 이것은 매우 나쁜 생각입니다.
물리적 메모리는 인접한 논리 메모리와 인접하지 않습니다.
- 1. nsapi 초기화 기능에 할당 된 메모리가 영구적입니까?
- 2. 함수가 반환되면 함수에서 할당 된 메모리가 해제됩니까?
- 3. UITable을 연속으로 만들 수 있습니까?
- 4. 생성자에서 예외가 발생하면 객체에 할당 된 메모리가 자동으로 삭제됩니까?
- 5. 보내기/받기 패킷 버퍼에 미리 할당 된 동일한 메모리가 있습니다.
- 6. 포인터가 할당 된 메모리가 함수 뒤에는 있지만 배열에는없는 이유는 무엇입니까?
- 7. alloca로 할당 된 메모리가 기능 끝이나 범위 끝에서 해제됩니까?
- 8. Malloc -> 얼마나 많은 메모리가 할당 되었습니까?
- 9. 할당 된 주소에서 구조를 인스턴스화하십시오 (할당 할당)
- 10. Java JVM 운영 체제에 대한 메모리 할당 유지
- 11. 운영 체제가 추상화되어 있습니까?
- 12. 항목을 연속으로 선택
- 13. 잘못된 ID와 제목으로 생성 된 ATCTContent
- 14. 힙에 할당 된 개체
- 15. 보기 컨트롤러가 할당 취소되었지만 메모리가 부족하여 viewDidUnload가 호출되었습니다.
- 16. 운영 체제/페이징
- 17. 단일 요청에서 PHP가 할당 한 메모리가 항상 끝에 릴리스됩니까?
- 18. _PyString_Resize realloc 메모리가 있습니까?
- 19. 보존 된 속성에 할당 된 할당 된 개체의 보유 수
- 20. 함수에서 할당 된 메모리의 주소 반환
- 21. 새 실행 파일에서 토스터를 사용할 수 없습니까? 제목으로
- 22. SafeArrayGetElem 호출에서 사용 가능한 메모리가 있습니까?
- 23. 이미지를 UINavigationBar의 제목으로 사용할 수 있습니까?
- 24. UIImageView 회전을 연속으로 움직이는 방법
- 25. 동적으로 할당 된 메모리는 어디에 있습니까?
- 26. 은 메모리가 자바
- 27. C 메모리 할당 : 메모리가 부족한 이유 (250K 만 해당)
- 28. Google지도입니다. 제목으로 파서를 조정하십시오.
- 29. 메모리가 고정 (고정) 되었습니까?
- 30. 정적으로 할당 된 메모리 양 계산
'인접한'단어를 찾으십니까? –
그러나 특정 C++ 프로그램의 메모리 구조가 실제로 gdb인지 확인하고자하는 경우. –
스택 오버플로 익스플로잇 (여기에서 우리 사이트의 이름으로 소품)을 수행하려는 경우, 힙 오버플로가 적절하게 실행되도록 내용을 오버플로 할 수 있으므로 인스턴스는 중요하지 않습니다. 비록 그들이 아래에서 말했듯이, 메모리의 물리적 주소는 모든 경우에 연속적이지 않습니다. –