Я пытался найти ответ, но ничего не увидел прямо.
Как освободить выделенную память в следующем фрагменте кода:
const char* attStr = strdup(OtherCharStr);
string str(attStr, strlen(attStr));
delete str; //???
Вам нужно освободить attStr, а не строку c ++, которая освободит только свои ресурсы.
void func()
{
const char* attStr = strdup(OtherCharStr);
string str(attStr, strlen(attStr));
free(attStr);
}//here str will release its own resources
Также вы можете сделать
строка str = OtherCharStr;
вот и все. Только проверьте, что происходит с OtherCharStr
C ++ использует идиому под названием RIAA — Приобретение ресурсов — это инициализация. Это означает, что время жизни объекта определяется переменной областью действия.
{
std::string s("foo"); // variable s declaration and string initialization
do_some_stuff(s);
// end of scope of variable s - it is destroyed here
// no need to free(s) or whatever
}
// variable s and the string doesn't exist here, no memory for it is allocated
Это относится только к объектам C ++, которые правильно поддерживают свои ресурсы (освобождают их в деструкторе). Простые указатели этого не делают — вы должны сами их освободить:
const char *attStr = strdup(...);
// do something with attStr
free(attStr); // because strdup() documentation says you should free it with free()
Также обратите внимание, что C ++ использует new
а также delete
скорее, чем malloc()
а также free()
:
std::string *strPointer = new std::string(...);
// RIAA doesn't work here, because strPointer is just plain pointer,
// so this is the case when you need to use free() or delete
delete strPointer;
Я рекомендую прочитать кое-что о умные указатели которые удаляют объект, на который они указывают автоматически. Я довольно далеко от первоначального вопроса, но эта тема важна, чтобы понять, как работает C ++.