2012-07-03 2 views
1

malloc을 사용하여 다른 클래스의 생성자 안에 클래스의 생성자에 매개 변수를 전달할 수 있습니까? new으로 할 수 있습니다. 나는 malloc과 같은 일을 수행해야합니다 (가 이해가되지 않는 경우, 내가 malloc 대신 사용자 정의 할당 사용하고 있음을 고려)의 malloc와 지금malloc 및 C++의 생성자

Class A_Class ... { 
     public: 
     B_Class *b; 
... 
    A_Class: ... 
     { b = new B_Class (c1, c2, c3); 
     } // end of constructor 
} 

을 :

Class A_Class ... { 
     public: 
     B_Class *b; 
... 
    A_Class: ... 
     { b = (B_Class*) malloc (sizeof(*b)); 
     ??????????????? } 
} 
+1

* B = B_Class (C1, C2, C3); –

+1

'malloc'을'new'보다 왜 원하는가요? –

+0

실제로는 사용자 정의 할당 자입니다. 질문을 더 합리적인 것으로 만들기 위해 "malloc"이라는 템포를 사용했습니다. –

답변

9

malloc은 원시 메모리를 할당합니다. 생성자 인수를 전달하지 않으므로 생성자 인수를 전달하려고 시도 할 필요가 없습니다.

당신은 원시 메모리로 작업해야하는 경우, 그것은 "placement new"구문

... 
void *raw_b = malloc(sizeof *b); 
b = new(raw_b) B_Class(c1, c2, c3); // <- placement new 
... 

수치를 사용하여 이전에 할당 된 원시 메모리에 객체를 생성하는 당신에게 달려, b의 값은 동일합니다 raw_b으로, 즉 여분의 raw_b 포인터없이 얻을 수 있습니다. 하지만 나는 이런 식으로 중간에 void * 포인터를 사용하여 추악한 캐스트를 피하기를 선호합니다.

이러한 개체를 파괴 할 때는주의하십시오. 맞춤 할당에는 맞춤 삭제가 필요합니다. 일반적으로 bdelete 수 없습니다. 대칭 사용자 정의 삭제 순서는 원시 메모리 할당 해제

b->~B_Class(); // <- explicit destructor call 
free(b); 

추신 : 다음에 명시 적 소멸자 호출을 포함하는 것 다른 경로를 고려해보십시오. 개체를 만들어야 할 때마다 명시 적으로 맞춤 할당을 지정하는 대신 클래스에 operator new/operator delete을 오버로드하는 것이 좋습니다.

+0

감사합니다 Andrey. raw_b에 새로운 메모리를 할당하지 않습니까? 이 방법으로 raw_b가 첫 줄에 할당 된 메모리를 사용합니까? –

+0

@Amir Reza : 그렇습니다. 표준 기능의 핵심입니다. 이 새로운 배치 배치 양식은 정확히 다음을 수행합니다. 사전 할당 된 메모리의 지정된 위치에 객체를 생성합니다. – AnT

+1

캐스트를 피하는 것 외에도'void *'포인터의 또 다른 장점은'new'의 결과에서'B_Class * '를 얻으면 포인터가 B_Class 실제 B_Class 객체를 가리킨다. –

0

malloc 생성자를 호출하지 않습니다. 호출되지 않는 함수에 매개 변수를 전달할 방법이 없습니다. 커스텀 할당 자에 관해서는, 당신이하는 일에 대해 더 구체적이어야합니다. 누가 커스텀 할당자를 사용하여 어디에 할당 할 것인가. 일반적으로 사용자 지정 할당자는 할당에만 사용됩니다. 그들은 생성자에 대해서도 관심이 없다.

+0

James에게 감사드립니다. 물론 생성자를 호출하지 않습니다. 하지만 왜 메모리를 할당 한 후에 매개 변수를 전달할 수 없습니까? "새로운"것 자체가하는 것과 같은 것. –

+0

메모리를 할당 한 후에도 생성자를 호출하지 않기 때문입니다. 생성자에 매개 변수를 전달할 수있는 유일한 방법은 new 연산자입니다. (초기화에서 할당을 분리했거나 새로운 사용자 정의 연산자를 사용하는 경우 배치 가능함) –

2

아니요, 불가능합니다. C++ 용으로 설계된 경우 사용자 정의 할당자는이 용도로 사용되는 construct이라는 함수를 가지며 다른 유형을 생성 할 수있는 할당자를 얻으려면 rebind입니다.

C++ 03에서는 복사 건설 만 수행되므로 allocator.construct(ptr, B_Class(c1, c2, c3))으로 전화해야하며 클래스를 복사 할 수 있어야합니다. C++ 11에서 할당자는 모든 인수로 구성 할 수 있습니다.

할당자가 C 용으로 설계된 경우 소위 "배치 새로 만들기"를 사용해야합니다. 물론, malloc는 C. 당신은 자신을 위해 그것을 찾아야한다 설계하지만, 구문입니다 :

b = (B_Class*) malloc(sizeof(*b)); 
new ((void*)b) B_Class(c1,c2,c3); 

생성자 던질 수 있다는 예외 및 free 버퍼를 처리해야합니다.

+0

배치 위치를 새로 지정하려면'#include '이 필요합니다. – Pierre

+0

@Pierre : true. 내가 "스스로 찾아 봐"라고 말한 이유 중 하나는 내가 그렇게 세부적으로 자신을 기억할 수 없다는 것을 믿을 수 없을 정도로 거의 사용하지 않는다는 것이다. 그리고 나는 그것에 대해 들어 본 질문자보다 이점이 있습니다! –

+0

그냥 댓글을 쓰지 마세요 :) – Pierre

0
넌 B를 구성하기위한 정적 방법을 만들 수

:

class B_Class 
{ 
    public static B_Class* MallocMe(SomeParam param) 
    { 
      B_Class* retval = (B_Class*) malloc(sizeof(B_Class)); 
      retval->Construct(param); 
      return retval; 
    } 
....