LINUX.ORG.RU

а что так нельзя?

 


0

2

что-то подумал об этом, а ведь этот пример об утечки памяти.

char *df ( )
{
  char *f = ( char * ) malloc ( 10 );
  memset ( f, 0, 10 );
  strncpy ( f, "aaa", 3 );
  return f;
}

int main ()
{
  printf ( "%s\n", df() );
}

память не удалил - да, утечка. Что тут удивительного?

former_anonymous ★★★
()

Открой уже для себя g++ и std::shared_ptr.

ox55ff ★★★★★
()

Продолжай наблюдение.

anonymous
()

Я не понимаю. Зачем в прикладных программах хватать куски памяти памяти, когда можно объявить переменную или массив?

PeKar
()
Ответ на: комментарий от xmikex

Тс напоминает анекдот про Хигинса, когда тот скупает пол магазина, а продовец спрашивает: «Вы во что играете» - «Вот и я, пип, хочу знать во что они играют».

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от ox55ff

Как ты будешь возвращать из функции строку, созданную в рантайме?

Каком «рантайме»?

PeKar
()
Ответ на: комментарий от Begemoth

Произвольные ограничения на размеры это ведь так прекрасно!

Насколько произвольные и на размеры чего?

PeKar
()

Можно так:

char *df(void)
{
  static _Thread_local char f[10];
  
  memcpy(f, "aaa", 4);

  return f;
}
Sorcerer ★★★★★
()

Прикинь, за такое в приличном обществе по рукам бьют. Конечно, ядро за тебя память подчистит, но это не повод мусорить где попало

XMs ★★★★★
()
Ответ на: комментарий от ox55ff

Как ты будешь возвращать из функции строку, созданную в рантайме?

Передавайте буфер (и его длину) внутрь функции, возвращайте адрес этого буфера.


#define AS(x) (sizeof(x)/sizeof(x[0]))
char *df( char *buf, size_t size ) {
    ...
    return buf;
}
int main() {
  char buf[10];
  printf("%s\n", df(buf, AS(buf)));
  return 0;
}
bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 3)
Ответ на: комментарий от bormant

Передавайте буфер (и его длину) внутрь функции, возвращайте адрес этого буфера.

А почему не количество использованных байт?

Ну и – нафига всё это? ТС никогда не писал и не будет писать код, в котором тормоза аллокации/деаллокации становятся существенны. А если вдруг в каком-нибудь параллельном мире доберется, то про существование кастомных аллокаторов к тому времени узнает.

Так что пусть аллоцирует на хипе и убирает за собой пока :)

Stil ★★★★★
()

В общем.

char *df ( )
{
  char *f = ( char * ) malloc ( 10 );
  memset ( f, 0, 10 );
  strncpy ( f, "aaa", 3 );
  return f;
}

int main ()
{
  char *s = df ();
  printf ( "%s\n", s );
  free ( s );
}
Так что не забывайте про это.

u0atgKIRznY5
() автор топика

але школоло, долго ты будешь всякую куйню на форум постить ?

anonymous
()
Ответ на: комментарий от i-rinat

Что бы мы без твоих советов делали.

Хорошее сообщение. Когда мысленно не можешь поднять настроение, слова могут помочь.

u0atgKIRznY5
() автор топика

Используй статические анализаторы:

clang-tidy:

main.c:16:1: warning: Potential memory leak [clang-analyzer-unix.Malloc]
}
^
main.c:15:20: note: Calling 'df'
  printf ( "%s\n", df() );
                   ^
main.c:7:24: note: Memory is allocated
  char *f = ( char * ) malloc ( 10 );
                       ^
main.c:15:20: note: Returned allocated memory
  printf ( "%s\n", df() );
                   ^
main.c:16:1: note: Potential memory leak
}
^

cppcheck:

main.c
строка 15
id: leakNoVarFunctionCall
Allocation with df, printf doesn't release it.

fsb4000 ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Почему нельзя просто использовать базовые возможности C++ и не перейти на std::string?

Я редко вижу таких как ты - вечно барахтаетесь в грязи, боретесь с несуществующими проблемами, тогда как остальные просто пролетают над этим «болотом безрезультатных потуг» и остаются чистыми и продуктивными.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

я же говорю, что взял и подумал об этом примере, в этом примере был char *.

u0atgKIRznY5
() автор топика

О сколько еще открытий чудных тебе предстоит…

Deleted
()
Ответ на: комментарий от Stil

А почему не количество использованных байт?

А потому, что пофигу сколько ты их использовал. Важно сколько ты их выделил.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Ты читал код, на который я отвечал?

Stil ★★★★★
()

Наброшу... Некоторые весь Си-код (отнюдь не маленьких и не маргинальных проектов) пишут без malloc:
http://www.catb.org/gpsd/hacking.html#malloc
Для Ъ:

Don't use malloc!
The best way to avoid having dynamic-memory allocation problems is not to use malloc/free at all. The gpsd daemon doesn't (though the client-side code does). Thus, even the longest-running instance can't have memory leaks. The only cost for this turned out to be embedding a PATH_MAX-sized buffer in the gpsd.h structure.
Don't undo this by using malloc/free in a driver or anywhere else.
Please note that this restriction includes indirect callers of malloc like strdup.

Tayler ★★
()
Ответ на: комментарий от Tayler

Я не знаю, что за демон, поэтому не понял ничего. Имеется в виду, что нужно использовать везде массивы фиксированной длины, что ли?

hotpil ★★★★
()

В чем тут прикол? Если есть malloc, то должен быть free. Так что, это совершенно очевидный пример. Или я чего то просмотрел?

hotpil ★★★★
()
Ответ на: комментарий от hotpil

Я не знаю, что за демон, поэтому не понял ничего.

gpsd. В каждом андроиде крутится, ЕМНИП. Но это не суть важно.

Имеется в виду, что нужно использовать везде массивы фиксированной длины, что ли?

Да. Именно так они и делают, и с этим живут тасскать.

Tayler ★★
()
Ответ на: комментарий от u0atgKIRznY5

Пффффф. Ну как тебе сказать. Тут и так все кроме тебя об этом знали. Серьезно, прочитай хоть один учебник по Си, тогда у тебя количество таких «открытий» заметно уменьшится.

Aswed ★★★★★
()
Ответ на: комментарий от Tayler

Наброшу... Некоторые весь Си-код (отнюдь не маленьких и не маргинальных проектов) пишут без malloc:

да, пони тоже розами какают и стэк у них бесконечный ...

alwayslate ★★
()
Ответ на: комментарий от u0atgKIRznY5

Я твою шизофрению уже год точно на ЛОРе наблюдаю. Всё это время ты пытаешься осилить сишку.

И только сейчас дошел до того, что память надо освобождать?

Попробуй Go, серьезно. Это — твой язык.

mersinvald ★★★★★
()
Ответ на: комментарий от Tayler

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

На крестах так вообще всё очень удобно с соответствующей обвязкой классов.

mersinvald ★★★★★
()
Ответ на: комментарий от Tayler

Наброшу... Некоторые весь Си-код (отнюдь не маленьких и не маргинальных проектов) пишут без malloc:

Не использовать динамически выделяемую память без острой необходимости - это отличный совет на самом деле.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от mersinvald

Я берегу нервы и зрение лоровцев, читающих твои посты.

Ну понятно, значит ты выбрал себя в качестве альтернативной защиты. Это ж как ты план будешь выполнять с такой то выдуманной обязанностью? Твои советы, которые мне даёшь, помогают лоровцам? Может ты не тебе советы даешь? Может тебе по теме лучше писать?

Это тоже самое, что ты хочешь на роликах кататься, а тебе предлагают на велосипеде.

Ну для меня это не тоже самое. В общем ты понел? Что от темы когда отходишь, чушь получается?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Лечи шизофрению. Совет попробовать другой язык — абсолютно в тему в этом треде.

Не осилил сишку за год даже на базовом уровне — не мучайся.

mersinvald ★★★★★
()
Ответ на: комментарий от mersinvald

Не осилил сишку за год даже на базовом уровне — не мучайся.

Я её уже больше трех лет учу ( по немногу ). Для меня это не мучение.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от mersinvald

И только сейчас дошел до того, что память надо освобождать?

Именно ту, которая возвращает как указатель на память, что в printf не использовать, потому как указателя на память не будет.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

возвращает как указатель на память

указателя на память не будет

че

maked0n
()
Ответ на: комментарий от u0atgKIRznY5

память надо освобождать
Именно ту, которая возвращает как указатель на память, что в printf не использовать, потому как указателя на память не будет

Кто-нибудь может это расшифровать?

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.