У меня такой класс:
class Kot{
public:
string name;
};
Я создаю экземпляр этого:
Kot* kot = new Kot;
kot->name = "John";
Затем я хочу создать дубликат строки:
string name;
name = strdup(kot->name.c_str());
я использую strdup
потому что я хочу, чтобы delete kot
и использовать только name
переменная.
название
But I have a 5 bytes memory leak due tomemory allocation.
удалять &name`, но у меня есть:
How can I free it safely? I tried to do
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
Возможно, вы обнаружили 5-байтовую утечку памяти, но это не из-за string
,
Каждый звонок strdup
создает новый char[]
размера, соответствующего длине строки. Вы должны привязать его к необработанному указателю char*
и удалить его в какой-то момент.
Вместо этого вы создали временный char*
указатель. Давайте назовем это temp
для наших целей.
temp
Строка затем передается std::string
конструктор. std::string
марки другой копия, оставив оригинал temp
неповрежденными.
Тогда temp
указатель просто исчезает, без должной очистки памяти.
В конце, когда std::string
объект уничтожен, он корректно очищает свою собственную частную копию строки. Но память, ранее указанная temp
никогда не освобождается
Быстрое решение будет:
char* temp = strdup(kot->name.c_str());
name = temp;
free(temp);
Однако вам даже не нужно этого делать! Если вы назначите один std::string
возражать против другого, вы уже делаете правильную копию его содержимого. Так:
name = kot->name;
Скорее всего, будет делать именно то, что вы пытаетесь достичь — создание копии kot->name
в вашем name
, В таком сценарии name
а также kot->name
стать двумя совершенно отдельными строками с одинаковым (копируемым) содержимым. С этого момента, изменение / удаление одного не влияет на другое.
Ты используешь free()
не delete
,
Функция strdup () должна возвращать указатель на новую строку, которая
дубликат строки, на которую указывает s. Возвращенный указатель может быть
перешел кfree()
, Пустой указатель возвращается, если новая строка
не может быть создан.
У вас есть утечка памяти здесь:
name = strdup(kot->name.c_str());
потому что вы никогда не освобождаете память, выделенную strdup
,
Чтобы избежать этой проблемы, вы можете просто построить name
от kot->name
:
name = kot->name;