Software Development/C, C++

2_new1_new,operator new, operator delete

huiyu 2014. 7. 20. 13:47

1. new의 정확한 동작방식

1. operator new()라는 함수를 사용해서 메모리 할당

2. (1)이 성공하고 객체라면 생성자 호출

3. C의 메모리 주소를 해당 타입으로 캐스팅해서 리턴.


2. 생성자/소멸자를 호출하지 않고 메모리만 할당하는 방법은?

Point* p = static_cast<Point*>(operator new(sizeof(Point)));
operator delete(p);

위의 방법을 이용하면 생성자는 호출되지 않고 메모리만 할당되는 것을 알 수 있다.


3. operator new()를 재정의 해서 메모리 할당을 변경 가능하다(new 자체를 재정의 하는게 아니다)

#include <iostream>
using namespace std;
void* operator new( size_t sz)
{
	cout << "my operator new : " << sz << endl;
	return malloc(sz);
}
void* operator new( size_t sz, char* s, int n)
{
	cout << "my operator new2 : " << sz << endl;
	return malloc(sz);
}

void operator delete(void* p )
{
	cout << "my operator delete" << endl;
	free(p);
}
int main()
{
	int* p1 = new int; // 인자가 1개인 operator new()
	int* p1 = new("AA", 2) int; // 인자가 3개인 operator new
	delete p1;
}

operator new()는 오버로딩이 가능하다. 단, 반드시 1번째 인자는 size_t를 가져야 한다. 

두번째 인자부터는 마음대로 만들어도 된다.


728x90

'Software Development > C, C++' 카테고리의 다른 글

2_new3_nothrow  (0) 2014.07.23
2_new2_예제  (0) 2014.07.21
1_this4_다중 상속의 멤버함수 포인터  (0) 2014.07.20
1_this3_멤버 변수의 포인터  (0) 2014.07.20
1_this2_함수포인터의 this  (0) 2014.07.20