std::string
выделяется через std:allocator
(или параметр шаблона).Даже если бы вы могли отсоединить сырое хранилище, вам бы пришлось освободить его и через std::allocator
.И вы, конечно, хотели бы, чтобы класс RAII делал это правильно.
К счастью, в стандартных библиотеках уже есть именно такой класс RAII.Она называется std::string
.
. Ближайшая вещь к функции "отсоединения", следовательно, swap
.Он отсоединяет ресурсы от строки и сохраняет их в форме, из которой они могут быть корректно освобождены позднее (т. Е. В другой строке).В C ++ 11 назначение перемещения также делает это.
std::string raii_for_ptr;
const char *ptr = NULL;
{
std::string s = "Hello world!";
raii_for_ptr.swap(s); // or raii_for_ptr = std::move(s)
ptr = raii_for_ptr.c_str();
assert(s == "");
}
// no need to cleanup
Если ваша цель состоит в том, чтобы создать для себя необходимость вызывать delete
для чего-то, то (а) это абсурдно, а значит (б)) стандартные библиотеки вам не помогут.В любом случае вам, вероятно, понадобится delete[]
, а не delete
.Но поскольку строки не (непосредственно) выделяются с помощью new
, неуместно думать, что вы можете взять их память и освободить ее (напрямую) с помощью delete[]
.
Итак, если ваша реальная ситуация такова, что вынеобходимо передать некоторый ранее существующий API буфер, который будет освобожден с помощью delete[]
, тогда вам придется взять копию, как если бы вам нужно было передать некоторый ранее существующий API, буфер, который будет освобожден с помощью free
.