Запросите использование переменной «char *» в c ++

0

Я использую переменную char * в моем коде cpp. Мой запрос заключается в том, что мы должны выделять память для переменной char * с помощью new() или malloc()?

std::string str;
char* chrarray = NULL;
chrarray = str.c_str();

Может ли кто-нибудь сказать, есть ли у фрагмента кода некоторые утечки памяти?

Какая должна быть хорошая практика использования таких переменных?

char* error;
error = dlerror();

Я видел приведенный выше код на странице man linux для dlopen. Почему память не выделяется для переменной ошибки?

  • 1
    Код, который вы показываете, не имеет утечек памяти. Тот факт, что у вас есть указатель, не означает, что вы должны выделить для него память, все зависит от ситуации. Как и в приведенном выше коде, ничего не выделяется, вы просто указываете на один указатель.
Теги:
char

3 ответа

3
Лучший ответ

У вас есть утечки памяти, когда вы выделяете память или берете на себя ответственность за ранее выделенную память и не можете отделить выделение этой памяти, когда она вам больше не нужна.

В вашем примере вы получаете указатели на уже выделенные структуры, но вы не принимаете на себя ответственность за освобождение этой памяти.

В случае c_str() вы получаете указатель на внутреннюю память строки. Если эта строка выпадает из области действия и уничтожается, этот указатель более недействителен. Его не нужно освобождать, так как вы его не владеете. Вероятно, есть другие вещи, которые лишат вашего указателя, поэтому вам нужно быть очень осторожным при использовании таких указателей.

Лучший способ написать это:

const char* chrarray = str.c_str();

Нет необходимости инициализировать указатель на NULL а затем сразу же переписать его на что-то еще.

Второй случай описывает, что происходит во многих старых библиотеках C, где они будут возвращать указатели на общую память, которой у вас нет. Некоторые из них не являются потокобезопасными, поскольку все потоки относятся к одному и тому же блоку, поэтому внимательно прочитайте документацию, когда вы получаете указатели. Если вы возьмете на себя ответственность за это, вам придется уничтожить, используя правильный метод, или вы будете течь.

0
std::string str;
char* chrarray = NULL;
chrarray = str.c_str();

не содержит утечки памяти. chrarray укажет на внутренние данные строки (независимо от того, что она пуста прямо сейчас) и очень возможно, что ей нельзя доверять после внесения изменений в строку.

char* error;
error = dlerror();

будет инициализировать переменную error до последней ошибки семейства функций dl*. Если вы не забудете правильно закрыть динамическую библиотеку, которую вы использовали, не должно быть утечки памяти... Если вы не запустили ситуацию, обнаруженную при утечке памяти, сообщенную valgrind в dlopen?

0

Вы не выделили какую-либо память в этом фрагменте, так что вопрос о утечке памяти я не думаю

std::string str;
char* chrarray = NULL;
chrarray = str.c_str();

И вот что говорит man-страница для dlerror()

dlerror()

Функция dlerror() возвращает читаемую пользователем строку, описывающую самую последнюю ошибку, которая произошла из dlopen(), dlsym() или dlclose() со времени последнего вызова dlerror(). Он возвращает NULL, если ошибки не произошли с момента инициализации или с момента последнего вызова.

Это означает, что вам не нужно выделять память при использовании dlerror, строка будет возвращена вам. Но вам нужно позаботиться, чтобы возвращаемое значение было NULL

  • 0
    Вы только что сохранили вопрос?
  • 1
    ОП спросил, есть ли утечка в его фрагменте или нет, и я ответил на тот же запрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню