2012-01-18 6 views
1

저는 Integer를 보유하고있는 클래스 (또는 Baseclass를 상속합니다)를 구현하고 있습니다. 지금은 내가 유일한 값으로 포인터를 반환 할 수있는 문제가 있으면,두 번째 IntObject.getValue()에서 잘못된 반환 값

Inte foo = Inte(5); 
cout << foo.getValue() << endl; // 5 
foo.setValue(10); 
cout << foo.getValue() << endl; // 10 
cout << foo.getValue() << endl; // 4199696 

은을 getValue 기능은 아무것도하지 않는 .: 포인터를 반환 외에, 나는 그것이 후 4,199,696을 반환 왜 아무 생각이 없다 최초의 getValue(). 여기

내 수업 :이 기능에

class Object { 

public: 
    virtual int getValue() = 0; 
    virtual void setValue(int *pointer) = 0; 
    virtual string toString() = 0; 

}; 


class Inte : public Object { 
private: 
    int* value; 
public: 
     Inte (int *val){ 
      value = val; 
     } 

     Inte (int val){ 
      int a = val; 
      value = &val; 
     } 

     virtual int getValue(){ 
      return *value; 
     }; 

     virtual void setValue(int *pointer){ 
      value = pointer; 
     }; 

     virtual void setValue(int val){ 
      int a = val; 
      value = &val; 
     }; 

     virtual string toString(){ 
      stringstream ss; 
      string s; 
      ss << value; 
      ss >> s; 
      return s; 
     }; 
}; 
+0

'toString()'은 아무 것도 반환하지 않습니다. – hmjd

+0

지금, 감사합니다 :) – pharno

답변

2
virtual void setValue(int val){ 
    int a = val; 
    value = &val; 
}; 

당신은 지역 변수 (val)의 주소를 저장합니다. 일단이 함수가 끝나면이 주소는 무효화됩니다.이 주소는 undefined behavior 인 주소 (getValue에있는 포인터)를 참조 해제하려고 시도합니다.

+0

고마워요. 하지만 getValue()의 첫 번째 호출이 작동하는 이유는 무엇입니까? 정확히 어떻게 고칠 수 있습니까? – pharno

+0

@pharno : 정의되지 않은 동작은 아무 일도 발생할 수 없음을 의미합니다. 여기에는 한 번, 두 번 이상 작동하지만 일부 지점에서는 명백한 이유없이 실패합니다. 이 문제를 해결하기 위해서는 새로운'int' 객체를 동적으로 생성해야합니다 :'value = new int (val)'- 이제는 수동 리소스 관리의 세계로 들어서면서 새로운 문제를 야기합니다. –

+0

"정의되지 않은 동작"은 컴파일러도 언어도 더 이상 프로그램의 기능이나 이유에 대해 신경 쓰지 않음을 의미합니다. 실제로 메모리에로드되기 전에 프로그램의 주소 공간에서 임의의 데이터로 시작하는 결과에 대한 이유가 될 수 있습니다. – bronekk