Указатель статической переменной? - PullRequest
5 голосов
/ 27 июля 2010

Является ли это незаконным / опасным?

int* static_nonew()
{
    static int n = 5;
    return &n;
}

Кажется, что с этим у компилятора нет проблем, но защищено ли расположение указателя от перезаписи, когда кому-то еще нужна память?

РЕДАКТИРОВАТЬ: немного больше объяснения, почему я задал этот вопрос.Примечание: я программирую на C ++, я просто пометил его как C, потому что это было больше похоже на вопрос C, чем C ++.

У меня есть класс, который должен возвращать статическую карту.Я хочу, чтобы эта карта инициализировалась один раз в программе, так как нет необходимости делать это несколько раз.По этой причине я собирался получить что-то вроде этого:

static std::map<std::string, Transition*> transitions;
static Transition trans1(transitions, ...);
static Transition trans2(transitions, ...);
return &transitions;

Конструктор классов переходов добавит себя к переходам.Таким образом, он будет создавать переходы один раз и затем возвращать указатель на них.Я просто помню, что если вы создадите ссылку на переменную, расположенную в стеке, она может быть очень легко перезаписана и «небезопасна».Я просто немного запутался, как именно работают статические переменные, созданные внутри функции.

Ответы [ 4 ]

6 голосов
/ 27 июля 2010

Это просто функция get для указателя статической переменной. В этом нет ничего противозаконного. По сути это не более опасно, чем любой другой тип статических данных.

Но статические данные:

  1. создает жесткую связь
  2. препятствует повторному входу
  3. создает возможность для тонких ошибок
  4. часто является признаком слабого дизайна
  5. следует использовать очень разумно

Модификатор класса статического хранилища означает, что память будет зарезервирована для этой переменной на время существования процесса.

5 голосов
/ 27 июля 2010

Это действительный код, и он полезен.

Многие синглтон-заводы построены так.

1 голос
/ 28 июля 2010

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

0 голосов
/ 27 июля 2010

Если вы имели в виду int* static_nonew( )

После того, как вы вернули указатель на любую ячейку памяти, эта память может быть перезаписана, в C. нет никаких гарантий защиты

Кроме того, если вы передадите этот указатель на free, поведение будет неопределенным, поэтому иногда оно будет в порядке, а иногда сбрасывает ядро.

С другой стороны, это полностью допустимый код.Также, замените int на struct, который вам нужно инициализировать один раз, и это довольно полезная идиома.

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