delete 연산자나 free 함수로 해제되는 것을 막는 방법이 있나요?
글쓴이: hiluciano / 작성시간: 수, 2013/08/14 - 3:36오후
class Foo
{
private:
int * m_pInteger;
public:
/* 할당과 해제는 생성자/소멸자에서만 되도록 함 */
Foo() { this->m_pInteger = new int(); }
virtual ~Foo() { delete this->m_pInteger; }
int * GetInteger() const { return this->m_pInteger; }
};
Foo * foo = new Foo();
이런 클래스가 있을 때
어떤 함수에서 악의적으로
delete foo->GetInteger();
foo의 멤버인 m_pInteger를 해제시켜버리면
이를 참조하는 다른 함수들에서 오류를 일으킬텐데요
delete 구문이 듣지 않도록하려면 GetInteger의 반환형을 어케 하나요
Forums:
꼭 포인터로 넘겨야할 이유가 있는 것이 아니라면
꼭 포인터로 넘겨야할 이유가 있는 것이 아니라면 레퍼런스로 넘기시는 것이 가장 좋을 것 같습니다.
일부러 이상하게 쓰고자 한다면 delete(&foo->GetInteger); 와 같은 식으로 해제할 수도 있겠지만 이렇게까지 이상하게 쓰는 사람이 있다면 그 사람 잘못이겠지요 ㅎㅎ
답변 감사합니다.
실제로는 수많은 자식 클래스를 둔 추상 클래스 형식의 멤버를 갖고 있습니다
class Foo {
private: CMyClass ** m_pAbstract; // 이건 포인터 배열이고 원소가 NULL일 수도 있습니다
public: CMyClass * GetClass(int a) { return this->m_pAbstract[a]; }
}
멤버가 이런 식으로 되어있고
CMyClass는 추상클래스입니다
Foo * foo = new Foo();
이 경우 delete foo->GetClass(0); 또는
CMyClass * tmp = foo->GetClass(0);
delete tmp;
이런 구문이 듣지 않도록 할 수 있을까요?
포인터를 반환하지말고 포인터에 대한 래퍼 클래스를
포인터를 반환하지말고 포인터에 대한 래퍼 클래스를 만들어서 참조만 가능하게 만들순 있지만, 애초에 악의적인 코드라면 소스를 보여지는입장에서 어떤수를 써도 사악한 코드를 막을수는 없습니다.
C++에는 단연 누구보다도 자신 있을 사람들이
C++에는 단연 누구보다도 자신 있을 사람들이 만들었을거라 추정되는
표준라이브러리도 악의적으로 사용하면 그냥 죽습니다.
쓰는 사람이 조심해서 잘 써야 되는거죠.
댓글 달기