Умные указатели, это и конструкторы

Как вы уже знаете, UNIX позволяет процессам иметь набор переменных среды, которые являются парами ключ / значение, причем оба ключа и значение являются строками. Операционная система отвечает за сохранение этих пар для каждого процесса отдельно.

Программа может получить доступ к своим переменным среды через этот UNIX API:

  • char *getenv(const char *name);
  • int setenv(const char *name, const char *value, int override);
  • int unsetenv(const char *name);

Процессы также наследуют переменные среды из родительских процессов. Операционная система отвечает за создание копии всех «envars» в момент создания дочернего процесса.

Bash , среди других оболочек, может устанавливать свои переменные среды на пользовательский запрос. Это то, что существует для export.

export - это команда Bash для установки переменной среды для Bash. Все переменные, заданные этой командой, будут наследоваться всеми процессами, которые этот Bash создавал.

Подробнее о Среда в Bash

Другой вид переменной в Bash является внутренней переменной. Поскольку Bash - это не просто интерактивная оболочка, она на самом деле является интерпретатором сценария, так как любой другой интерпретатор (например, Python) способен хранить свой собственный набор переменных. Следует отметить, что Bash (в отличие от Python) поддерживает только строковые переменные.

Обозначение для определения переменных Bash - name=value. Эти переменные остаются внутри Bash и не имеют ничего общего с переменными среды, хранящимися в операционной системе.

Подробнее о Параметры оболочки (включая переменные)

Также стоит отметить что, согласно справочному руководству Bash:

Среда для любой простой команды или функции может быть временно добавлена ​​путем префиксации ее назначениями параметров, как описано в Параметры оболочки . Эти утверждения присваивания влияют только на среду, видимую этой командой.

blockquote>

Чтобы суммировать вещи:

  • export используется для установки переменной среды в операционной системе. Эта переменная будет доступна для всех дочерних процессов, созданных с помощью текущего процесса Bash.
  • Обозначение переменной Bash (name = value) используется для установки локальных переменных, доступных только текущему процессу bash
  • Обозначение переменной Bash, префикс другой команды, создает переменную среды только для области действия этой команды.

0
задан Apollys 16 January 2019 в 22:26
поделиться

1 ответ

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

Thing th(6, thing_ptr);

, у вас нет выбора в отношении времени жизни этого объекта: он заканчивается в следующем заключении }, если объявлен в функциональном блоке или с концом времени жизни содержащегося объекта, если он объявлен как член класса, или в конце программы, если он объявлен как член пространства имен. std::unique_ptr<T> с использованием средства удаления по умолчанию может содержать только указатель на объект, созданный с использованием new, поскольку средство удаления по умолчанию пытается использовать delete.

Если ваши указатели всегда будут на объекты с обычными объявлениями, подобными этим, и не созданы с использованием new, то вы застряли, убедившись, что указатели используются только в течение времени жизни объектов, на которые они указывали в. И в этом случае не так уж много преимуществ от использования std::unique_ptr; вы можете пойти дальше и использовать необработанный указатель, который по-прежнему является обычным способом представления указателя, когда что-то еще (здесь сам язык C ++) отвечает за проблемы жизни.

Если вам нужна возможность указателей, которые переживают функциональный блок, в котором создается объект, вы не можете использовать обычный синтаксис объявления объекта. Одна из возможных альтернатив состоит в том, чтобы при создании объекта использовать функцию create вместо прямого объявления объекта:

class Thing {
public:
    static std::unique_ptr<Thing> create(const Thing& src)
    { return { new Thing(src) }; }
    static std::unique_ptr<Thing> create(int data)
    { return { new Thing(data) }; }

    void PrintData() const;

private:
    // All constructors private, to make sure a Thing can ONLY be
    // created by a create() function - including the copy constructor.
    Thing(const Thing&) = default;
    explicit Thing(int data) : data_(data) {}

    int data_;
};

int main() {
    auto thing_ptr = Thing::create(6);
    thing_ptr->PrintData();
}
0
ответ дан aschepler 16 January 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: