RAII Это - странное название простого, но потрясающего понятия. Лучше имя Объем Связанное управление ресурсами (SBRM). Идея состоит в том, что часто Вы, оказывается, выделяете ресурсы при начинании блока и должны выпустить его в выходе блока. Выход из блока может произойти нормальным управлением потоком, выпрыгнув из него, и даже исключением. Для покрытия всех этих случаев код становится более сложным и избыточным.
Просто пример, делающий его без SBRM:
void o_really() {
resource * r = allocate_resource();
try {
// something, which could throw. ...
} catch(...) {
deallocate_resource(r);
throw;
}
if(...) { return; } // oops, forgot to deallocate
deallocate_resource(r);
}
, Как Вы видите, существует много способов, которыми мы можем получить pwned. Идея состоит в том, что мы инкапсулируем управление ресурсами в класс. Инициализация его объекта получает ресурс ("Приобретение Ресурса, Инициализация"). В то время, когда мы выходим из блока (область действия блока), ресурс освобожден снова.
struct resource_holder {
resource_holder() {
r = allocate_resource();
}
~resource_holder() {
deallocate_resource(r);
}
resource * r;
};
void o_really() {
resource_holder r;
// something, which could throw. ...
if(...) { return; }
}
, Который хорош, если у Вас есть собственные классы, которые не являются только в целях выделения/освобождения ресурсов. Выделение просто было бы дополнительным беспокойством, чтобы сделать их задание. Но как только Вы просто хотите выделить/освободить ресурсы, вышеупомянутое становится неловким. Необходимо записать переносящийся класс для каждого вида ресурса, который Вы получаете. Для упрощения этого интеллектуальные указатели позволяют Вам автоматизировать тот процесс:
shared_ptr create_entry(Parameters p) {
shared_ptr e(Entry::createEntry(p), &Entry::freeEntry);
return e;
}
Обычно, интеллектуальные указатели являются тонкими обертками вокруг нового / удаляют, это просто, оказывается, звонит delete
, когда ресурс, которым они владеют, выходит из объема. Некоторые интеллектуальные указатели, как shared_ptr позволяют Вам говорить им так называемое средство удаления, которое используется вместо delete
. Это позволяет Вам, например, управлять дескрипторами окна, ресурсами регулярного выражения и другим произвольным материалом, пока Вы говорите shared_ptr о правильном средстве удаления.
существуют различные интеллектуальные указатели в различных целях:
является интеллектуальным указателем, который владеет объектом исключительно. Это не находится в повышении, но это, вероятно, появится в следующем Стандарте C++. Это non-copyable, но поддерживает передача права собственности . Некоторый пример кода (следующий C++):
Код:
unique_ptr p(new plot_src); // now, p owns
unique_ptr u(move(p)); // now, u owns, p owns nothing.
unique_ptr v(u); // error, trying to copy u
vector> pv;
pv.emplace_back(new plot_src);
pv.emplace_back(new plot_src);
В отличие от auto_ptr, unique_ptr может быть помещен в контейнер, потому что контейнеры будут в состоянии содержать non-copyable (но подвижный) типы, как потоки и unique_ptr также.
является интеллектуальным указателем повышения, который не copyable и не подвижен. Это - идеальная вещь, которая будет использоваться, когда Вы хотите удостовериться, что указатели удалены при выходе из объема.
Код:
void do_something() {
scoped_ptr sp(new pipe);
// do something here...
} // when going out of scope, sp will delete the pointer automatically.
для общего владения. Для этого это и copyable и подвижно. Несколько экземпляров интеллектуального указателя могут владеть тем же ресурсом. Как только последний интеллектуальный указатель, владеющий ресурсом, выходит из объема, ресурс будет освобожден. Некоторый пример реального мира одного из моих проектов:
Код:
shared_ptr p(new plot_src(&fx));
plot1->add(p)->setColor("#00FF00");
plot2->add(p)->setColor("#FF0000");
// if p now goes out of scope, the src won't be freed, as both plot1 and
// plot2 both still have references.
, Как Вы видите, источник графика (функция fx) совместно используется, но у каждого есть отдельная запись, на которой мы выбираем цвет. Существует weak_ptr класс, который используется, когда код должен относиться к ресурсу, принадлежавшему интеллектуальному указателю, но не должен владеть ресурсом. Вместо того, чтобы передать необработанный указатель, необходимо тогда создать weak_ptr. Это выдаст исключение, когда это заметит, что Вы пытаетесь получить доступ к ресурсу weak_ptr путем доступа, даже при том, что нет никакого shared_ptr, больше владеющего ресурсом.
Вы должны создайте файл манифеста, в котором указано, что вашему приложению требуются права администратора. Вы можете включить манифест в исполняемый файл или сохранить его как отдельный файл (yourapp.exe.manifest)
Ответ ZippyV в порядке, если вы собираетесь запустить javaw.exe с правами системного администратора, что, если чистый код Java блокируется UAC (например, при попытке записать файл в привилегированный каталог), то это то, что вам нужно сделать.
Если, однако, вы пытаетесь запустить что-то внешнее, но только с повышением прав, вы можете связать exe, который повышает уровень команды. Вот один .