delete / multiple inheritance

8 отговора 476 прегледа
#1

delete / multiple inheritance

днес се замислих върху следното:

ако имам:

class A {virtual ~A();};
class B {virtual ~B();};
class C: public A, public B {virtual ~C();};

и после:
{
C *c = new C;
B *b = c;

delete b;
}

че стойностите на b и c са различни е ясно
че деструкторите ще се извикат коректно, ок
това което ме тормози е какъв адрес ще бъде подаден на менажера на паметта, след като стойността на b не сочи в началото на блока?

Отговор
в отговор на ~!@$%amp;^*()_+ #2

Re: delete / multiple inheritance

подава се адресът на most derived обекта. за да се разбере кой е той трябва да има поне една виртуална функция, а по стандарт за такава е избран деструкторът.



5.3.5 Delete [expr.delete]

1 The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.

delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression

The first alternative is for non-array objects, and the second is for arrays. The operand shall have a pointer type, or a class type having a single conversion function (12.3.2) to a pointer type. The result has type void.

...

3 In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand's dynamic type and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.73)

unsigned
Отговор
в отговор на ~!@$%amp;^*()_+ #3

Re: delete / multiple inheritance

Programmer's rule #9: If you are not sure how something works, test it.

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор
в отговор на ow4o #5

Re: delete / multiple inheritance

Щото преди него има още 8.

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор
в отговор на Duncan Griffin #6

Re: delete / multiple inheritance

тествах го, само че гаранция франция, дали ще бачка на различни компилатори и какви странични ефекти може да има

Отговор
в отговор на ~!@$%amp;^*()_+ #7

Re: delete / multiple inheritance

Абе я ти вземи парите, пък предложи 1 месец безплатен съпорт и бъгфиксинг.

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.

Редактирано от Duncan Griffin на

Отговор
в отговор на Duncan Griffin #8

Re: delete / multiple inheritance

идеята я бива, ама съм на заплата
а мразя да си уплътнявам времето с дебъгване.
единственото което мразя повече е четене на чужд код и естествено, върха на черешката, дебъгване на чужди лайна

Отговор
в отговор на ~!@$%amp;^*()_+ #9

Re: delete / multiple inheritance

абе зависи как е написан чуждия код, понякога е добре дошъл :)
но за чуждите лайна си абсолютно прав, да мрат лайнотворците!

Отговор