2012-09-11 5 views
1

을 삭제하면 내가 C++에서 코드의 다음과 같은 부분이 있습니다는 참조되지 않은 동적 메모리

class X { 
    ... 
}; 

class Y { 
public: 
    Y(X*) {...}; 
    ... 
}; 

void main() 
{ 
    X* px = new X; 
    new Y(px); 
    ... // *** 
} 

어떻게 주에서 만든 클래스 Y의 개체를 삭제할 수 있습니까? (*) ... 대신 기존 코드를 변경하지 말고 코드 줄을 새로 추가 할 수 있습니다.

+1

반대로 내가 코드를 작업 의 예를 제공하고 싶습니다 숙제 것 같은데? – hmjd

+0

약간 미친 건축을 생각하면 저에게 숙제처럼 보입니다. 다시 태그를 추가하거나이 코드의 실제 목적이 무엇인지 설명하십시오. – Rook

+1

또한 무엇을 시도 했습니까? 무엇이 잘못 되었습니까? 완벽한 솔루션이 구현 될 것으로 기대하는 것처럼 질문을 표현했습니다. – Rook

답변

7

면책 조항 절대로 이런 코드를 작성하지 마십시오. 가능한 경우 동적 객체를 사용하지 말고 필요할 때 항상 RAII을 사용하여 간단하고 예외적 인 방식으로 객체를 관리하십시오.

교체를 가진 첫번째 ... : void main() 이후

#define void int 

가 무효이며, 내 컴파일러를 거부합니다. 컴파일러가 충분히 기능을 제대로 수행하지 못하면 필요하지 않을 수도 있습니다. 나중에 정의 된 정적 변수에 삭제해야합니다 객체에 대한 포인터를 은닉하기 위해

WTF() = this; 

:

함께 두 번째를 교체합니다. 이것으로 한 번에 하나의 객체 만 제어 할 수 있습니다. 그러나 미친 요구 사항을 감안할 때, 나는 그것을 사용할 수있게하는 더 좋은 방법을 생각할 수 없다. 생성자 인수가 사용 가능하다면 대신 X의 비 정적 멤버에 숨길 수 있습니다. 인수는 이름이 없으므로 아무 것도 할 수 없습니다.

Repace와 세 번째 :. 그들은 클래스 정의 외부에 정의해야하기 때문에에서 포인터를 숨기고 우리에게 정적 변수를 제공

static Y *& WTF() {static Y * y; return y;} 

그것은, 전역 또는 정적 클래스 멤버가 될 수 없습니다. 이상한 요구 사항없이

delete Y::WTF(); 
delete px; 

, 당신이 모든 혼란을 대체 할 수 :

이제 우리는 함께 네 번째 교체 할 수

int main() { 
    X x; 
    Y y(&x); 
} 

모든이의 교훈은 다음과 같습니다 C의 메모리 관리 ++ 올바른 방법으로하면 아주 간단합니다. 잘못하면 잘못 처리합니다.

+0

+1 그리고 http://images.wikia.com/creepypasta/images/5/56/Disgusted-oh-god-why- text.png –

2

나는 완전히 마이크의 대답에 동의하지만, Luchian의

class X { 
public: void*data; 
}; 

class Y { 
public: 
    Y(X*px) 
    { px->data = this; }; 
}; 

int main() 
{ 
    X* px = new X; 
    new Y(px); 
    delete static_cast<Y*>(px->data); 
    return 0; 
} 
관련 문제