2009-11-12 5 views
1

새 운영 연속으로 할당 된 메모리가 있습니까? 제목으로

+4

'인접한'단어를 찾으십니까? –

+0

그러나 특정 C++ 프로그램의 메모리 구조가 실제로 gdb인지 확인하고자하는 경우. –

+0

스택 오버플로 익스플로잇 (여기에서 우리 사이트의 이름으로 소품)을 수행하려는 경우, 힙 오버플로가 적절하게 실행되도록 내용을 오버플로 할 수 있으므로 인스턴스는 중요하지 않습니다. 비록 그들이 아래에서 말했듯이, 메모리의 물리적 주소는 모든 경우에 연속적이지 않습니다. –

답변

16
BYTE* data = new BYTE[size]; 

은 주어진 어떤 크기, 반환 된 메모리 영역은 연속입니다. 힙 관리자가 size의 연속 메모리를 할당 할 수 없으면 실패합니다. 예외 (또는 malloc의 NULL)가 리턴됩니다.

프로그래머는 프로세스의 주소 공간에 항상 연속적인 (예, 무한대 :-) 메모리가 있다는 환상을 보게됩니다. 이것은 가상 메모리가 프로그래머에게 제공하는 것입니다.

프로그래머 (일부 임베디드 시스템 제외)는 항상 가상 메모리를 볼 수 있습니다. 그러나 사실상 연속적인 메모리는 임의의 방식으로 물리적 메모리에 매핑 될 수 있습니다 (일반적으로 4KB 인 '페이지'크기의 세분성). 이 매핑은 볼 수 없으며 대부분 특정 페이지 수준의 최적화를 제외하고는 이해할 필요가 없습니다.

어떨까요?

BYTE* data1 = new BYTE[size1]; 
BYTE* data2 = new BYTE[size2]; 

물론, 당신은 data1data2의 상대 주소를 말할 수 없습니다. 일반적으로 비 결정적입니다. 요청이있을 때 힙 관리자 (예 : malloc, new은 방금 malloc으로 바뀜) 정책과 현재 힙 상태에 따라 다릅니다.

+8

와우. 'new'가 실패하면'std :: bad_alloc'을 던집니다. ** **는 NULL을 반환하지 않습니다. – rlbond

+0

죄송합니다, 혼란 스러움. 이전 Visual C++ 구현에서는 NULL을 반환했지만 이제 C++ 표준을 준수합니다. http://msdn.microsoft.com/en-us/library/kftdy56f(VS.71).aspx – minjang

+1

무한한 메모리? 나는 잊는다, 그것은 무엇을 의미 하느냐? –

6

프로세스의 주소 공간에 할당 된 메모리의 연속이 될 것입니다 ... 나는 하나 개의 새로운 작업에 의해 할당 된 메모리가 연속인지, C++로 알고 싶어했다.

이러한 바이트가 실제 메모리에 매핑되는 방식은 구현에 따라 다릅니다. 매우 큰 메모리 블록을 할당하면 실제 메모리의 다른 부분에 매핑 될 가능성이 있습니다.

편집 : 누군가가 바이트가 연속으로 보장되는 것을 동의하기 때문에는 표준 말한다 (3.7.3.1) :

할당 기능은 스토리지의 요구 금액을 할당하려고 시도합니다. 성공적이면, 바이트 단위의 길이가 요청 된 크기 이상이어야하는 저장 블록의 시작 주소를 리턴해야한다. 이 코드에서

+0

따라서 결과는 다음과 같습니다. 당신은 정말로 그들이 있는지 모른다.). – AntonioMO

+2

이것이 잘못된 것입니다. 귀하의 프로세스 안팎에 주문할 수 있다는 보장은 없습니다. – olliej

+0

그래서 우리 프로그램이 사용하는 메모리가 가상 메모리라는 것을 의미합니까? 가상 메모리는 OS에 의해 물리적 메모리에서 매핑됩니다 (이 매핑 메커니즘은 구현과 관련이 있습니까?). – iBacchus

2

할당 된 바이트의 가상 주소는 연속적입니다. 또한 프로세스의 주소 공간을 뒷받침하는 상주 페이지 내에서 물리적으로 연속적입니다. 물리적 페이지를 프로세스 가상 공간의 영역에 매핑하는 것은 OS와 플랫폼에 따라 다르지만 일반적으로 물리적으로 인접한 범위를 페이지에 더 크게 또는 정렬하지 않을 수 없습니다.

3

사례 1 : "새로운"배열을 할당하여이 경우

int* foo = new int[10]; 

같이 foo를 각 요소 연속 가상 메모리에있을 것이다.

사례 2 :이 경우

int* foo = new int; 
int* bar = new int; 

같이 , 비 원자 연속 "새로운"작업을 사용하여이 호출 사이에 할당 된 메모리에 인접한 "새로운"될 것입니다 수 있다는 보장이 결코 가상 메모리.

0

예.

"가상 메모리"문제에 대해 신경 쓰지 마십시오. 가상 메모리를 지원하는 시스템이 전혀없는 경우가 있습니다. PoV에서 연속적인 메모리 청크가 발생합니다. 그게 다야.

0

질문에 "연속적으로 new() 연산이 인접한 메모리 덩어리를 사이에 끼우지 않고 반환하겠습니까?"라고 말하면이 오래된 프로그래머는 매우 정중하게 말하면 그것.

유일한 질문은 하나의 데이터 객체에서 "out"포인터를 걷고 다음 데이터 객체에서 "into"로 포인터를 이동하려는 경우입니다. 주소 공간에있는 다음 객체가 이전 객체와 동일한 유형과 원격으로 유사한 객체라는 보장이 없기 때문에 이것은 매우 나쁜 생각입니다.

0

물리적 메모리는 인접한 논리 메모리와 인접하지 않습니다.

관련 문제