2014-02-14 3 views
0

다음 코드를 고려하십시오.동적으로 객체를 만들고 memset을 0으로 만듭니다.

class A 
{ 
    private : 
     int a; 
    public : 
     void function1() 
     { 
       cout<<"hello world"<<endl; 
     } 
     void function2() 
     { 
       cout<<"bye bye world"<<endl; 
     } 
}; 
int main() 
{ 
    A *obj = new A(); 
    memset(obj,0,sizeof(A)); 

    obj->function1(); 
    obj->function2(); 
    delete obj; 
    return 0; 
} 

함수 호출이 실패해야합니다. 이 코드를 실행하려고하면 완벽하게 실행됩니다. memset이 메서드의 주소에 영향을주지 않는 이유는 무엇입니까? 무슨 일이 일어나고 있는지 설명해 주시겠습니까?

+4

기능은 각 개체에 저장되지 않습니다. 그것은 엄청난 공간 낭비입니다. – chris

+1

생성 된 객체에서 memset()을 호출하는 이유는 무엇입니까? – EJP

답변

1

&A::function1 함수의 주소를 가져 와서 인쇄하십시오. 개체의 주소 &obj과 비교하십시오.

메모리에서 개체 자체는 비 정적 데이터 멤버와 단일 vtable 포인터 만 포함 할 수 있습니다.

실제 메소드는 데이터가 아닌 코드입니다. 그것들은 모든 객체들 사이에서 공유되며 당신은 그것을 변경할 수 없습니다. 배후에서 클래스 메소드는 프로그래머가 지정한 인수 외에이 포인터를 투명하게 받아들이는 "특수"함수입니다.

그렇다면 내부 상태를 0으로 쓰면 일부 개체가 실제로 엉망이 될 수 있습니다.

0

컴파일러는 클래스의 인스턴스와 함께 멤버 메서드 또는 정적 멤버를 저장하지 않습니다.

따라서 memset은 메서드 주소에 아무런 영향을주지 않습니다.

0

"실제 메서드는 데이터가 아니라 모든 개체간에 공유되며 사용자가 변경할 수 없습니다. 장면 클래스 메서드는 간단히"특수 "함수로이 포인터를 투명한 방식으로 받아들입니다. 프로그램 제작자."

여기에 가상 함수에 액세스하려고 시도하지 않으므로 위 코드가 올바르게 작동합니다. 가상 메소드 중 하나를 만들면 VPTR은 NULL로 memset 될 것이고 분할 결함 (또는 정의되지 않은 동작)이있을 수 있습니다.

감사합니다. 프라 이브

관련 문제