2010-06-21 4 views
3

표현 operator new(sizeof(T))::operator new을 통해 T 바이트를 올바르게 할당합니까?클래스 별 연산자 new

는, new T()이 (생성자를 호출하기 전에) 메모리를 할당하는 방법을 정확하게하는 방법을있는 경우 operator new의 클래스 별 버전을 호출 할 수있는 방법이 있습니까?

T::operator new(sizeof(T))

는 그것을 정의하는 기본 클래스의 경우에도 T 상속을 operator new를 정의하지 않습니다 T 경우 컴파일 타임 오류를 제공합니다. 내가 전화하고 싶은 것은 : operator new
  • Base::operator new을 정의

    • Foo::operator newFoo 경우 경우 operator new을 정의 Base에서 Foo 파생됩니다 (I는 다중 상속에 대한합니까 무엇?) 그렇지 않으면
    • ::operator new
  • +0

    왜 명시 적으로 호출해야합니까? 클래스에 연산자 new가 오버로드되면 컴파일러는 해당 객체를'new ClassName'으로 인스턴스화 할 때마다이를 사용합니다. –

    +0

    @Ama : 개체를 인스턴스화하고 싶지 않기 때문에. 나는 단지 기억을 원한다. 그래서 나중의 시점에서 새로운 배치를 사용할 수있다. – fredoverflow

    +0

    달성하고자하는 것을 설명해 주시겠습니까? 확실히 당신이 객체의 구성으로부터 메모리의 할당을 분리한다면 당신은 당신이 적합하다고 생각하는 방식으로 메모리를 할당 할 수 있습니까? 왜'new T '와 같은 방식으로 메모리를 할당해야합니까? –

    답변

    1

    표준 라이브러리는 사용자 정의 타입 할당 알고리즘을 필요로하는 클래스의 템플릿 파라미터로서 설정된다 할당 자 객체를 사용하여이 문제를 해결한다.

    두 번째 글 머리 기호로 이미 입증 된 것처럼 내가 한 일을 할 수있는 완벽한 방법이 없다고 생각합니다. 컴파일러가 두 부모를 모두 정의한 경우 사용할 부모 연산자를 알 수있는 방법이 없습니다.

    예를 들어 컴파일 타임에 적절한 크기/풀을 선택하는 작은 객체 할당 자 풀을 구현하려는 경우 독립형 템플릿 할당 자 함수를 사용하는 경우는 object_allocator<T>::allocate()이고 템플릿 유형은 자동으로 크기를 알아 보도록하겠습니다. 다중 상속 문제로 인해 연산자 new를 상속받을 수는 없지만 모든 클래스에서 메모리를 할당하는 방법을 쉽게 파악할 수 있습니다.

    0

    다른 정적 함수 allocate을 정의하고에서이 함수를 호출하십시오.

    class X { 
    public: 
        static void * allocate(size_t size) { 
          //... 
        } 
        void *operator new(size_t size) { 
         return allocate(size); 
        } 
    }; 
    
    void f() { 
        void * p = X::allocate(sizeof(X)); 
        X * x = new(p) X; 
    } 
    
    +0

    그 해결책은 내 취향에 너무 관입 적이기 때문에 :( – fredoverflow

    관련 문제