C++ 클래스별 new/delete Override하는법?
글쓴이: jic5760 / 작성시간: 금, 2017/11/17 - 11:31오후
안녕하세요.
C++ 에서 Class별로 new/delete 연산자를 Override하고싶습니다.
void* operator new(std::size_t size) throw(std::bad_alloc) { } void operator delete(void *ptr) throw() { } void* operator new[](std::size_t sz) throw(std::bad_alloc) { } void operator delete[](void* p) throw() { }
우선 위같이 하면
A *pA = new A;
char *pB = new char[1024];
이런식으로 하면 원하는데로 작동합니다.
그런데 저는 Global영역이 아닌 특정 Class영역안에서 new/delete연산자 override을 하고 싶습니다.
class Allocator { void* operator new(std::size_t size) throw(std::bad_alloc) { } void operator delete(void *ptr) throw() { } void* operator new[](std::size_t sz) throw(std::bad_alloc) { } void operator delete[](void* p) throw() { } } class Test : public Allocator { void test(){ A *pA = new A; // 클래스 할당 char *pB = new char[1024]; } }
이런식으로 해 봤는데 이런식의 new/delete Override는 제가 원하는 방식으로 동작하지 않더라구요..
그냥 기본 new/delete으로 동작합니다.
제가 원하는것은 위처럼 Allocator class을 상속받으면 그 클래스 안에서 사용되는 모든 new/delete에 대해 Allocator의 함수가 실행되길 원합니다.
C++에서 이런석이 가능할까요?
Forums:
static 멤버로 만드세요. c++ operator
static 멤버로 만드세요. c++ operator new 로 검색하면 금방 나오는데 굳이 질문하실 필요는 없었을 것 같네요.
안됩니다...
static으로도 해봤는데 안되더라구요..ㅠㅠ
클래스 안에서 new연산자로 작동하는게 아니라 해당 클래스의 dynamic allocator으로만 작동했습니다...ㅠㅠ
Allocator *pAlloc = new Allocator;
이런식으로 new operator를 지정한 class만 그 class의 new operator을 탑니다.
원하시는게 무엇인지 잘 모르겠군요. 원하시는 바를
원하시는게 무엇인지 잘 모르겠군요. 원하시는 바를 정확하게 말씀해주시는 것이 좋겠습니다.
소스코드를 바꾸지 않고 별도의 메모리관리를 하려고 합니다.
C++에서 new/delete로 메모리할당을 하는 소스를 그대로 사용하면서 별도의 Memory Pool을 이용해서 메모리 관리를 하려고 합니다.
그런데 C++에서 이런건 원래 지원을 안하는건지.. 모르겠네요..
여전히 뭘 하고 싶으신 것인지 잘 모르겠습니다. 앞선
여전히 뭘 하고 싶으신 것인지 잘 모르겠습니다. 앞선 글들을 보면 단순히 custom memory pool 을 replacement new 를 사용해서 구현하겠다는 것이 아니고 뭔가 특수한 방식으로 메모리 풀을 사용하고 싶으신 것 같은데 그걸 구체적으로 알려주셔야지요.
음... 그냥 위에 설명드린것이 전부입니다.
전역영역에서 new을 replacement해버리면 모든 클래스나 전역영역에서 MemoryPool을 써야하는데.. 저는 특정 클래스에서만 기존의 new을 통해서 메모리할당을 하는것을 custom memory pool을 통해 메모리할당을 하게 하고 싶은겁니다.
이를 통해서 클래스별로 메모리 프로파일링을 하려고 합니다.
혹시 특정 클래스(C 라고 부릅시다)의 메소드나
혹시 특정 클래스(C 라고 부릅시다)의 메소드나 생성자 안에서 new expression을 사용하면 그 때에만 특별히 정의된 new operator가 호출되도록 하고 싶으신 거라면 제가 아는 한 방법이 없습니다. (원하시는 것이 이것이 아니라면 무시하시구요.)
그게 가능하면 new의 의미가 애매해집니다. 소스 코드 레벨에서 정적으로 정해지는 것이 아니라 호출될 때마다 다른 new가 실행됩니다. 예를 들어 C의 메소드에서 vector를 new 로 동적 할당할 때에 vector가 호출하는 new와 다른 클래스의 메소드에서 new로 vector를 동적 할당할 때에 vector가 호출하는 new가 달라지니까요. C++은 그정도로 동적인 언어가 아닙니다. delete도 문제가 생기지요.
이게 가능하려면 C에서 new로 할당된 메모리는 반드시 C 안에서 delete되어야 합니다 (특별히 정의된 new에 맞춰서 특별히 정의된 delete가 호출되어야하니까요). 그런데 그렇지 않은 경우가 흔히 있겠지요.
아 그런문제가 있겠네요.. 답변 감사합니다!
처음 말씀하신 부분을 원했던게 맞습니다..^^
생각해보니 그렇게 구현하면 그런문제도 있겠네요.. 답변 감사합니다!^^
전역 말고 클래스별로 가능합니다.
::operator new 전역
class-name::operator new 클래스
https://learn.microsoft.com/ko-kr/cpp/cpp/new-and-delete-operators?view=msvc-170
감 오시죠?
원하는 걸 한 줄로 정확히 잘 적으셨는데 익명님은 왜 저리 못 알아들으시는지.
누가 누굴보고 못알아듣는다는 건지 아는만큼 보이는 법
누가 누굴보고 못알아듣는다는 건지
아는만큼 보이는 법
댓글 달기