。공부 。

<C++> 메모리공간 동적할당

kyoe 2007. 11. 30. 23:22
메모리공간을 효율적으로 사용하기 위해 우리는 메모리공간을 동적할당한다.
물론 배열을 이용해도 똑같은 결과를 얻을수 있지만 만약 데이터를 사용자로 부터 입력을 받는다고 했을때 모든사용자가 똑같은 길이의 값이나 내용을 입력하진 않을것이다 이럴때 배열을 이용한다면 우리는 배열의 크기를 얼마로 잡아야할지 정말 난감할것이다 이럴때 메모리공간은을 동적할당한다면 문제는 해결된다 사용자가 입력한 데이터의 길이만큼 메모리공간이 할당되기때문에 메모리공간은 효율적으로 운영이 된다.

- 동적할당 예제 -
class apple{
    char *name;
    char *address;
    int number;
public:
    apple(char *_name,char *_address,int _number);
};

apple::apple(char *_name,char *_address,int _number){
    name=new char[strlen(_name)+1];     //힙영역에 메모리공간 할당, name은 할당된공간의 포인터를 갖는다.
    strcpy(name,_name);      //할당된공간에 데이터 복사
   
    address=new char[strlen(_address)+1];
    strcpy(address,_address);
    number=_number;
}

int main(void){
    apple aa("kyoe","청주 과학대학",2003);   //객체생성
    return 0;
}

위예제 메인함수에서 apple클래스의 객체 aa를 생성하고 있다 aa객체는 스택영역에 메모리가 할당이 된다.
아직 생성자를 호출하지 않았기 때문에 단지 메모리공간만을 할당하고 있을 뿐이다.
apple클래스의 생성자 apple()의  매개변수로 *_name,*_address,_number를 받고 있다 메인함수에서 매개변수로 'kyoe'라는 문자를 넘겨주고 있는데 이때 문자자체를 넘겨주는 것이 아니라 'kyoe'가 스택영역에 할당된 메모리 주소 를 생성자에 넘겨주게 되는것이다.
apple()생성자의 '*_name'이 주소를 넘겨받고 new키워드에 의해 메모리공간을 동적할당하게 된다 이때  char[strlen(_name)+1]; 명령에 의해 입력받은 문자의 길이만큼 동적 할당되게 되는것이다.
strlen()함수는 문자열의 길이를 리턴하게 된다 현재 _name은 문자열의 길이는 4바이트가 들어있으므로 널문자를 제외한 4바이트가 리턴이되고 널문자를 포함하기 위해 +1을 해주는것이다. 이렇게 힙영역에 길이가 5인 캐릭터형배열이 할당되고 new라는 연산자에 의해 name변수에 힙영역의포인터주소를 리턴하게 됨으로써  name은 그 할당된 메모리공간을 가르키게 되는것이다.
이렇게되면 단지 메모리 공간에 사용자가 입력한 길이의 메모리공간만이 할당됐을뿐 아무것도 들어있지 않는 공간이 된다 .
strcpy(name,_name); 명령으로 _name가 가르키는 값을 힙영역에 할당된 메모리공간을 가르키는 name에 1바이트씩 복사를 해줌으로써 데이터는 힙영역메모리공간에 들어가게 되고 동적할당이 완성이되면서 객체가 생성되는것이다.

음... 복잡하게 설명한듯.. ㅡㅡ;;