C ++ статические переменные динамические - PullRequest
1 голос
/ 18 апреля 2010

Возможно или имеет смысл иметь статические динамические переменные в классе, инициализированные оператором new?

Ответы [ 4 ]

2 голосов
/ 18 апреля 2010

Вы имеете в виду следующее? Да, это разрешено.

class Class {
  static Base *b;
};

Base *Class::b = new Derived();

Используйте умные указатели, если вам нужно уничтожить их при выходе из программы

class Class {
  static boost::scoped_ptr<Base> b;
};

boost::scoped_ptr<Base> Class::b(new Derived());
2 голосов
/ 18 апреля 2010

Это может не иметь большого смысла, но вы, безусловно, можете сделать это:

 static int * p = new int(1);

Проблема заключается в уничтожении объекта. Это, вероятно, не имеет большого значения на практике, если деструктор не имеет какого-либо побочного эффекта (такого как запись в файл), который вам требуется, и в этом случае статический умный указатель (вероятно) выполнит эту работу.

Сказав это,

static int i = 1;

может показаться предпочтительным практически во всех обстоятельствах.

Редактировать: Я неправильно понял ваш вопрос, но я оставлю это здесь, так как он рекомендует смутно хорошую практику.

1 голос
/ 18 апреля 2010

В заявлении:

static cMyClass* p = new cMyClass() ;

Было бы неправильно называть p «статической динамической переменной». Это статическая переменная-указатель типа cMyClass *, указывающая на динамически размещаемый объект.

Называя ее «статической динамической» переменной, вы звучите как парадокс, хотя на самом деле это просто плохое описание чего-то, что может быть совершенно разумным. Есть две переменные: 1) статический указатель и 2) динамический объект.

1 голос
/ 18 апреля 2010

И если вы хотите убедиться, что он очищен после выхода из программы:

struct foo
{
    static double* d;
};

namespace
{
    void delete_double(void)
    {
        delete foo::d;
    }

    double* get_double(void)
    {
        double* result = new double();
        atexit(delete_double);

        return result;
    }
}

double* foo::d = get_double();

Или используйте умный указатель (см. Johannes ответ .)

...