Как освободить память после strdup?

У меня такой класс:

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 to
названиеmemory allocation.
How can I free it safely? I tried to do
удалять &name`, но у меня есть:

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

1

Решение

Возможно, вы обнаружили 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 стать двумя совершенно отдельными строками с одинаковым (копируемым) содержимым. С этого момента, изменение / удаление одного не влияет на другое.

2

Другие решения

Ты используешь free()не delete,

в стандартная документация:

Функция strdup () должна возвращать указатель на новую строку, которая
дубликат строки, на которую указывает s. Возвращенный указатель может быть
перешел к free(), Пустой указатель возвращается, если новая строка
не может быть создан.

2

У вас есть утечка памяти здесь:

name = strdup(kot->name.c_str());

потому что вы никогда не освобождаете память, выделенную strdup,

Чтобы избежать этой проблемы, вы можете просто построить name от kot->name:

name = kot->name;
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector