Постоянное переназначение символьных строк приводит к утечке памяти? - PullRequest
4 голосов
/ 03 сентября 2011

У меня два вопроса:

Q1. Символьные указатели используются для указания места, где хранится данная строка. Если мы продолжим переназначать строку, это приведет к утечке памяти?

В системе Linux я вижу:

$ cat chk.c
#include <stdio.h>

#define VP (void *)

int main()
{
        char *str;

        str = "ABC";
        printf("str = %p points to %s\n", VP str, str);

        str = "CBA";
        printf("str = %p points to %s\n", VP str, str);

        return 0;
}

$ cc chk.c && ./a.out
str = 0x8048490 points to ABC
str = 0x80484ab points to CBA
$

Q2. Какова максимальная длина строки, которая может быть назначена, как указано выше?

Ответы [ 4 ]

2 голосов
/ 03 сентября 2011

Может ли ваш пример кода утечка памяти?Нет. Вы присваиваете постоянные строки уже в своей программе, поэтому дополнительное выделение памяти не происходит.

Утечки памяти происходят из-за забытых вызовов типа malloc () или вызовов, которые выполняют внутри себя операции типа mallocs (), о которых вы можете не знать.Остерегайтесь функций, которые возвращают указатель на память ... таких как strdup ().Такие, как правило, либо не являются поточно-ориентированными, либо утечкой памяти, если не обоими.Лучше использовать такие функции, как snprintf (), где вызывающая сторона предоставляет как буфер памяти, так и максимальный размер.Эти функции не пропускают.

Максимальная длина строки: обычно не имеет искусственного ограничения, кроме доступной памяти.Память в стеке может быть ограничена различными ограничениями (char can_be_too_big [1_000_000]), но память из malloc () - нет.Память Malloc - это вопрос о том, сколько у вас свободной памяти (char * ok = malloc (1_000_000). Ваш локальный size_t обеспечивает максимальный объем памяти, который можно выделить теоретически, но на практике он намного меньше.

1 голос
/ 03 сентября 2011

ОК, чтобы быть более конкретным, обычно то, что происходит (специфично для ОС, но AFAIK, это универсально, возможно, где-то в спецификации), это то, что где-то в наборе команд вашего исполняемого файла находятся строки "ABC" и "CBA "- они встроены в вашу программу. Когда вы делаете str="ABC", вы говорите: «Я хочу, чтобы этот строковый указатель указывал на адрес в моей скомпилированной программе, который содержит строку ABC ». Вот почему существует разница между «строками» во время выполнения и «строковыми литералами», если вы видите это в документации где-либо. Поскольку вы не выделяли место для своего литерала - компилятор запек его в вашу программу - вам не нужно выделять для него место.

В любом случае, когда ваш процесс выгружается, ОС освобождает этот ресурс как естественный побочный эффект выгрузки вашей программы. На самом деле, в общем случае невозможно пропустить после выхода из программы, поскольку ОС будет освобождать любые ресурсы, которые вы забудете, даже чудовищные утечки, при выходе из программы . (это не совсем так - вы можете вызвать утечку другой программы, которая не выгружена, если вы делаете связанное с библиотекой - но это достаточно близко). Это всего лишь одна из тех вещей, о которых заботится ОС.

1 голос
/ 03 сентября 2011

Утечки памяти преобладают только тогда, когда мы выделяем память с использованием malloc/realloc/calloc и забываем free об этом.В приведенном выше примере нет, где мы выделяем память для себя, так что нет утечек памяти AFAIK.

0 голосов
/ 03 сентября 2011

при выделении памяти для somePointer p и без освобождения памяти или без указания других указателей на указание на эту память, если вы измените значение p, то в этой ситуации происходит утечка памяти.

(Например)

char* p =  malloc(sizeof(char)*n);
char* q= "ABC";

Тогда, если вы назначите,

p = q;

Тогда произойдет утечка памяти.Если вы не используете выделение памяти, то не будет никакой утечки памяти.

И,

char * q = "ABC";

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

char* q = "ABC";
q[1] = 'b';

Эти операторы приведут к ошибке сегментации.

MoreReference:

ErrorOnModifyingValue

DynamicMemoryAllocation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...