어쩌면 이것은 어리석은 질문일지도 모르지만, 나는 단지 물건을 엉망으로 만들지 않도록하고 싶습니다. 이 구조체가 있다고 가정합니다.
struct Foo{
struct Bar { virtual int calc(int x) = 0; };
Bar* barX;
Bar* barY;
int x,y;
Foo(Bar* bx,Bar* by) : barX(by),barY(by) {}
void process(int xx,int yy){
x = barX->calc(xx);
y = barY->calc(yy);
}
~Foo();
};
struct IDBar : Foo::Bar { int calc(int x) { return x; } };
int main() {
IDBar* b = new IDBar();
Foo f = Foo(b,b);
Foo f2 = Foo(new IDBar(),new IDBar());
}
C ++ 11 (즉, 스마트 포인터가 없음)을 사용할 수 없으며 100 % 확실하지 않습니다 ... 이것이 Bar
개체를 모두 (또는 하나만) 삭제하는 올바른 방법입니까?
Foo::~Foo(){
if (barX == barY){ delete barX; }
else { delete barX; delete barY; }
}
?
추신 : 아이디어는 객체 를 Foo
소유 한다는 것입니다 Bar
(따라서 객체를 삭제해야합니다). Bar
생성자에 전달 된 s는 다른 용도로 사용되지 않아야합니다. 실제로는 Bar
하나에 만 속할 수 있습니다 Foo
(나중에 깨달은 결함이지만 지금은 괜찮습니다). 또한 Foo
복사해서는 안됩니다 (명시 적으로 방지해야 할 수도 있습니다).
나는 Taztingo와 약간의 의견이 일치하지 않습니다. 객체가 전달 된 리소스의 소유권을 가져 오는 것은 부당하지 않습니다. 이것은 모든 종류의 실제 코드에서 발생합니다. 클래스가 생성자에 전달 된 리소스의 소유권을 갖는다는 사실이 문서화되어 있습니다. 누군가가 문서를 참조하지 않고 수업을 부적절하게 사용한다면, 그들은 스스로 총을 쏘는 것입니다.
그러나 이것이 오류가 발생하기 쉬운 것은 사실이며 이러한 종류의 오류를 포착하거나 발생하지 않도록 방지하고자합니다. 다른 사람이 자원을 소유하고 있다고 생각하지 않는다는 것을 보장 할 수있는 방법이 있다면 Foo
우리는 계속 될 것입니다. C ++ 11에서는 std::unique_ptr
. 이전 C ++ 표준에는 std::auto_ptr
. 이전 C ++ 표준에는 이동 생성자가 없지만 할당시 std::auto_ptr
리소스를 이전 리소스에서 포기 std::auto_ptr
하거나 새 std::auto_ptr
.
나는 당신이 사용하는 것이 좋습니다 std::auto_ptr
.
클래스의 두 생성자 매개 변수에 대해 동일한 리소스가 명시 적으로 전달 Foo
되도록 허용되는 경우 하나만 허용하는 새 생성자를 만듭니다 std::auto_ptr<Bar>
.
마지막으로 Foo
복사 할 수 없도록 만들려면 복사 생성자와 할당 연산자를 모두 전용으로 선언하면됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다