기초 지식의 메모리 관리 기초

4443 단어 메모리 관리
메모리 분배 방식은 세 가지가 있는데 (1) 정적 저장 영역에서 분배한다.메모리는 프로그램이 컴파일될 때 이미 분배되어 있으며, 이 안에 존재하는 프로그램의 전체 운행 기간에 모두 존재한다.예를 들어 전역 변수,static 변수.(2) 스택에서 생성됩니다.함수를 실행할 때 함수 내 국부 변수의 저장 단원은 모두 창고에서 만들 수 있고 함수 실행이 끝날 때 이 저장 단원들은 자동으로 방출된다.창고 메모리 분배 연산은 프로세서의 명령 집중에 내장되어 있어 효율이 높지만 분배된 메모리 용량에 한계가 있다.(3) 더미에서 분배하는 것을 동적 메모리 분배라고도 한다.프로그램이 실행될 때malloc나 new로 임의의 메모리를 신청하고, 프로그램원은 언제free나 delete로 메모리를 방출할지 스스로 책임진다.동적 메모리의 생존 기간은 우리가 결정하고 사용은 매우 유연하지만 문제도 가장 많다.【규칙7-2-1】malloc 또는 new로 메모리를 신청한 후 바늘값이 NULL인지 즉시 검사해야 한다.포인터 값이 NULL인 메모리의 사용을 방지합니다.[규칙 7-2-2] 수조와 동적 메모리에 초기 값을 부여하는 것을 잊지 마세요.초기화되지 않은 메모리를 오른쪽 값으로 사용하지 못하게 합니다.[규칙 7-2-3] 수조나 지침의 하표가 경계를 벗어나는 것을 피하고 특히'다1'또는'소1'조작이 발생하지 않도록 조심해야 한다.[규칙 7-2-4] 동적 메모리의 신청과 방출은 반드시 배합하여 메모리 유출을 방지해야 한다.【규칙 7-2-5】free나 delete로 메모리를 방출한 후 즉시 바늘을 NULL로 설정하여 야생 바늘이 생기는 것을 방지한다.
char a[]="hello";
a[0] = 'x';
cout<<a <<endl;
char *p = "world";//  p       ,       ,     
p[0] = 'x';//    
cout<<p<<endl;

메모리 용량 계산:
char a[]="hello world";
char *p = a;
cout<<sizeof(a)<<endl;//12  
cout<<sizeof(p)<<endl;//4  
void func(char a[100])
{
cout <<sizeof(a)<<endl;
}

바늘 파라미터는 어떻게 메모리를 전달합니까?만약 함수의 매개 변수가 바늘이라면, 이 바늘로 동적 메모리를 신청할 것을 기대하지 마라.다음 예에서 GetMemory는str가 원하는 메모리를 얻지 못했고str는 여전히null이다
void GetMemory(cha *p,int num)
{
p = (char*)malloc(sizeof(char)*num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str,100);
strcpy(str,"hello");
}

이런 상황을 처리하기 위해서 반드시 바늘 파라미터로 메모리를 신청해야 한다면, 반드시 '바늘을 가리키는 바늘' 으로 바꾸어야 한다
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100);
//       &str,    str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}

free와 delete: 바늘 값의 메모리를 방출했을 뿐 i는 바늘 자체를 없애지 않았습니다.썼어야생 지침: 쓰레기 메모리를 가리키는 지침이다.주요 원인은 다음과 같다.
4
  • 포인터 변수가 초기화되지 않았습니다.처음 생성된 모든 포인터 변수는 자동으로 NULL 포인터가 되지 않으며 기본값은 임의로 지정되며 한 줄기를 가리킵니다.따라서 포인터 변수는 생성하는 동안 NULL로 설정하거나 올바른 메모리를 가리키도록 초기화되어야 합니다

  • 4
  • new와 delete: new에는sizeof, 유형 변환과 유형 안전 검사 기능이 내장되어 있습니다.내부 데이터 형식이 아닌 대상에 대해 new는 동적 대상을 만드는 동시에 초기화 작업을 완료했습니다.new로 대상 그룹을 만들면 대상의 무변수 구조 함수만 사용할 수 있습니다
    Obj *objects = new Obj[100]; // 100
    Obj *objects = new Obj[100](1);// 100 1, 。
    delete :
    delete []objects; //
    delete objects; // , delete objects[0], 99 。
  • 좋은 웹페이지 즐겨찾기