Функция parse_str()
автоматически считывает все параметры запроса в массив.
Например, если URL-адрес http://www.example.com/page.php?x=100&y=200
, код
$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);
будет хранить «x» = 100 и «y» = 200 в $queries
.
Посмотрите документацию parse_str
EDIT
Согласно документации PHP, parse_str()
следует использовать только с второй параметр. Использование parse_str($_SERVER['QUERY_STRING'])
на этом URL-адресе создаст переменные $x
и $y
, что сделает код уязвимым для таких атак, как http://www.example.com/page.php?authenticated=1
.
Вот что std::make_shared
делает : Создать новый объект, используя переданные аргументы для передачи в подходящий конструктор. В вашем случае конструктор копирования.
То есть оператор
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem);
эквивалентен
std::shared_ptr<MemoryManager> wsk(new MemoryManager(mem));
Если вы хотите, чтобы ваш общий указатель ссылался на существующий объект, то вам нужно использовать
std::shared_ptr<MemoryManager> wsk(&mem);
Но это принесет с собой другие проблемы, так как, когда последний общий указатель будет уничтожен, он попытается освободить память, что невозможно для объекта, не созданного new
. Для этого есть два решения: либо создать (или использовать существующий) null-deleter , который на самом деле ничего не delete
; Или позволяя общему указателю обрабатывать полное владение (от создания до уничтожения) объекта.
И это действительно, как вы должны смотреть на умные указатели, не как своего рода самоуничтожающийся указатель, а с точки зрения владения ресурсом .