멤버로 다른 개체에 대한 포인터가있는 형식이 있습니다. 객체 (Demo)가 생성되면 생성자에서 다른 객체 (Property)를 초기화합니다. 이 객체가 많은 경우 다른 것으로 속성을 변경할 때 힙 공간을 낭비하고 싶지 않으므로 setProperty
에 초기화 된 메모리를 해제 한 다음 데모의 디 컴포지션에서 다시 삭제합니다. 그 시점까지는 다른 무언가로 설정되었습니다. 그러나 이로 인해 코드가 충돌합니다. property
을 재설정 할 때 재 할당하는 이유는 무엇입니까?C++ 포인터가되는 기본 개체 멤버를 삭제하는 방법
class Property{ };
class Demo{
protected:
Property *property;
public:
Demo(){ property = new Property();};
void setProperty(Property *p){
delete property;
property = p;
};
~Demo(){
delete property;
};
};
int main(){
Property p = Property();
Demo * d = new Demo();
d->setProperty(&p);
delete d;
}
'속성'은 어디에 선언 되었습니까? 또한'delete' 만 사용하여'new'로 생성 된 것을 해제합니다. 'main()'의'p'는 스택에 할당되어 있으므로'Demo :: ~ Demo()'는 스택 할당 객체를 효과적으로 삭제하고 있습니다. 이것은 정의되지 않은 동작입니다. – cdhowie
이것도 컴파일되지 않는다는 것 외에도 ('속성'은 존재하지 않습니다), 여기서 많은 오해가 있습니다. 어디서부터 시작해야할지조차 모릅니다. 왜 동적 할당을 사용하여 처음부터기도하고 있습니까? –
당신은 [규칙 3] (https://en.wikipedia.org/wiki/Rule_of_three_ (C % 2B % 2B_programming))을 위반하고 있으며, 당신은' 새로운 '. –