Нужен ли виртуальный деструктор для матрицы boost :: ublas? - PullRequest
0 голосов
/ 15 августа 2010

Нужен ли виртуальный деструктор, когда я использую матрицу boost :: ublas?

Кстати, мой класс - это шаблонный класс.

1 Ответ

1 голос
/ 15 августа 2010

Ты имеешь в виду, что у тебя есть это?

template <typename Whatever>
struct my_class
{
    // ...

    boost::ublas::matrix m;
};

Здесь нет ничего, что указывало бы, что у тебя есть виртуальный деструктор.


Тебе нужен виртуальный деструктор, когда ты намереваешься иметь пользователейпублично наследовать от вашего класса.Таким образом, этот вопрос должен звучать так: «Пользователи будут публично наследовать мой класс, нужен ли мне виртуальный деструктор?».Да, вы делаете.

Причина в том, что это приводит к неопределенному поведению:

struct base {}; // no virtual destructor
struct derived : base {};

base* b = new derived;

// undefined behavior, dynamic type does not match static type,
// and the base class does not have a virtual destructor
delete b; 

Это не:

struct base { virtual ~base(){} }; // virtual destructor
struct derived : base {};

base* b = new derived;

// well-defined behavior, dynamic type does not match static type,
// but the base class has a virtual destructor
delete b; 

Обратите внимание, что оно имеет 1016 * не имеет никакого отношения к тому, какие члены есть в базовом классе.Вам всегда нужен виртуальный деструктор, если пользователи будут удалять производные классы через указатель на базовый класс.


Я бы порекомендовал вам получить книгу так что вы знаете, что он делает, потому что звучит так, будто вы просто разбрасываетесь вещами и надеетесь, что это сработает, что не очень хороший подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...