'operator new'에 해당되는 글 1건

  1. 2008.08.12 operator new 와 new operator by 1stPasa

Widget *w = new Widget();

위와같이 클래스를 동적할당하면 C++은 두단계를 거쳐서 Widget의 인스턴스를 만들어 낸다.

우선 operator new 를 거쳐 메모리를 allocation 하는 작업이 선행되는데

코드를 살펴보면 단순히 malloc 을 사용해 메모리를 할당만 해줄 뿐이다.

사용자는 이 operator new 를 오버로딩 함으로써 특정 타입의 메모리 allocation을 컨트롤 할수 있다.

하지만 이대로는 Widget의 생성자가 호출이 되지 않은, 쓰레기만 차있는 메모리일 뿐인데

이 공간에 의미를 부여해주는것이 ( 그래봤자 생성자를 호출해줄 뿐. )

new operator 의 역할이다.


new operator는 건네받은 메모리 공간을 this 포인터로 밀어넣고

생성자를 호출해줌으로써 클래스 구실을 할수 있도록 만들어준다.

생성자 역시 하나의 ( this call type 의 )멤버 함수이므로  메모리에

인스턴스화 되지 않은채로는 호출할 방도가 없다.


Widget::Widget() 이런식으로 호출할수도 없는노릇이니..

생성자를 호출해주고 사용가능한 메모리 공간으로 만들어주는것은 인라인 어셈을 쓰지 않고서는

언뜻 c++ 문법만으로는 불가능해 보인다

하지만 아래와 같이 가능하다

new ( (void*) ptr ) Widget( );


위의 코드는 ptr 이 가리키는 메모리 공간을 필두로 Widget 클래스의 생성자를 호출해준다.

생성자의 인수에 따라 복사생성자를 포함한 어떠한 생성자도 호출이 가능하다

위의 코드를 디스어셈블리 해보면 operator new 가 한번 호출되는것을 확인할수 있는데.

그때의 operator new는 메모리를 할당하는것이 아니고 단지 전달받은 ptr을 돌려주기만 할 뿐이다.

그냥, 아무 하는일 없는 operator new가 한번 호출된다고 생각하면 된다.

Posted by 1stPasa

댓글을 달아 주세요