2017-04-07 2 views
-4
#include <iostream> 
#include <cstdlib> 
using namespace std; 

class Box { 
    public: 
     Box() { 
     cout << "Constructor called!" <<endl; 
     } 
     void printer(int x) 
    { 
     cout<<x<<" printer"<<endl; 
    } 

     ~Box() { 
     cout << "Destructor called!" <<endl; 
     } 

}; 

int main() { 
    Box* myBoxArray = new Box[4]; 

    Box* myBoxArray2 = (Box*)malloc(sizeof(Box[4])); 
    myBoxArray2->printer(23); 
    *myBoxArray2; 
    *(myBoxArray2).printer(23); 

    return 0; 
} 

문제는 단순히 생성자가 출력되지 않는 것을하지만 난 간단한 derefrence myBoxArray2에 대한 포인터는 생성자가 인쇄되지 않습니다 때 어느 쪽도 인쇄 된 연료 소모량 printer입니다 . 또한 ->을 사용할 때 퍼런 스 프린터가 실행되지만 동등 물을 사용할 때는 그렇지 않습니다. *(myBoxArray2).printer(23)차이가

+2

'malloc()'을 사용하면 유효하지 않습니다. 클래스 인스턴스는 스택에 또는'new'를 통해 할당되어야합니다. 'malloc()을 사용하면 (자), C++기구가 불려 가지 않습니다. – EJP

+0

'myBoxArray2'는 크기가 작은 메모리 공간에 대한 포인터 일뿐입니다. 무언가의 크기는 아닙니다. 그 공간에'myBoxArray'를 복사하더라도, 생성자가 호출되지 않습니다. 왜냐하면, 생성자가 생성되지 않기 때문입니다. – moopet

답변

1

malloc에만 메모리를 할당하며, 개체를 불확정 상태로 남겨 둘 수있는 생성자를 호출하지 않습니다. C에서

++ 당신이해야 거의 결코 사용 malloc, calloc 또는 free. 가능하면 newnew[]을 피하십시오. 대신 객체 인스턴스 또는 인스턴스 벡터를 사용하십시오. (처음에 정말 관련이) 두 번째 질문에 대해서는

, *(myBoxArray2).printer(23)은 참조 연산자 *보다는하여 . 선택 연산자 이후 잘못 한 높은 precedence입니다. 즉, 먼저 유효하지 않은 포인터에 . 멤버 선택기를 사용하고 아무런 결과도 반환하지 않기 때문에 printer이 반환하는 것을 역 참조하려고합니다.

당신은 (*myBoxArray2).printer(23)은 (별표의 위치 내부의 괄호입니다 주), 정확히 myBoxArray2->printer(23)과 동일하다 할 수 있습니다.

또한 myBoxArray2->printer(23)myBoxArray2[0].printer(23)과 같습니다.

1

차이점은 malloc은 메모리를 전혀 초기화하지 않고 할당한다는 것입니다. 반면에 new은 해당 생성자를 호출하여 해당 메모리를 초기화하고 (해당 생성자가 해당 메모리를 초기화하도록 만든 경우) 클래스를 사용할 수있게 만드는 다른 작업을 수행합니다.

또한 delete은 당신을 위해 소멸자를 호출합니다.

규칙은 : 당신이하는 일을 모르는 한, malloc을 C++과 함께 사용하지 마십시오.

+0

당신이 정말로하고있는 일을 (그리고 당신이하고있는 이유를) 알지 못한다면 - 그러므로 새로운 생성자. – UKMonkey

+0

당신이하고있는 일을 안다고해도 여전히 그렇게하지 않아야합니다. 컴파일러는 "Undefined Behavior"에 대한 명시적인 티켓 인 최적화 및 위반으로 인해 해당 오브젝트가 초기화되는 방식에 대한 가정을 할 수 있습니다. – tadman