powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет?
25 сообщений из 63, страница 1 из 3
Память будет освобождаться или нет?
    #39277355
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модератор: Лучше плодить темы, чем поднимать.

А вот в этом случае память течет или нет?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
char* conv(const char* sIn)
{
	char* sOut = new char[strlen(sIn)+5];
	sprintf(sOut, "%s.out", sIn);
	return sOut;
}

printf(conv("abcdef"));



Т.е. есть некая функция-конвертер, которая внутри создает новую строку, потом возвращает на нее указатель. Вызов этой функции я делаю только внутри вызовов других (ну как в printf), т.е. значение указателя ничему не присваивается.
Память будет освобождаться или нет?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277358
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потечет. Каждому new должен быть в конце delete, иначе память занята до конца работы приложения.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277359
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше используй string тогда проблем с памятью не будет.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277360
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечаем.

DeviLooper
А вот в этом случае память течет или нет?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
char* conv(const char* sIn)
{
	char* sOut = new char[strlen(sIn)+5];
	sprintf(sOut, "%s.out", sIn);
	return sOut;
}

printf(conv("abcdef"));





В этом случае память течёт.

DeviLooperТ.е. есть некая функция-конвертер, которая внутри создает новую строку, потом возвращает на нее указатель. Вызов этой функции я делаю только внутри вызовов других (ну как в printf), т.е. значение указателя ничему не присваивается.
Память будет освобождаться или нет?


Память НЕ будет освобождаться .
Ты должен освобождать её самостоятельно, или доверить её выделение и освобождение специальным классам.

Например:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
std::vector<char> conv(const char* sIn)
{
        std::vector<char> sOut( strlen(sIn)+5 );
	sprintf( &sOut[0], "%s.out", sIn );
	return sOut;
}

printf(&(conv("abcdef"))[0]);
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277371
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tиспользуй string
string, конечно, вещь удобная, но уж слишком раздувает бинарник. Vector в этом плане выглядит привлекательнее.

MasterZiv, вот только я не понял а вектор в этом случае когда будет память освобождать? Тоже при завершении программы?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277377
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperstring, конечно, вещь удобная, но уж слишком раздувает бинарник.

С чего бы этому мелкому макросу бинарник раздувать?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277379
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПамять НЕ будет освобождаться .
Ты должен освобождать её самостоятельно,
это совершенно нормальное соглашение - память, занятую результатом, явно освобождает вызывающий
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277386
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovС чего бы этому мелкому макросу бинарник раздувать?..

Ну если использовать <iostream>, то не заметно, только тут изначально 500кб бинарник.
Я <stdio.h> юзаю, так что <string> раздувает бинарник со 130кб, до 500
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277387
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeviLooperизначально 500кб бинарник.
400
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277389
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperDima Tиспользуй string
string, конечно, вещь удобная, но уж слишком раздувает бинарник. Vector в этом плане выглядит привлекательнее.

MasterZiv, вот только я не понял а вектор в этом случае когда будет память освобождать? Тоже при завершении программы?


конкретно тут при выходе из printf.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277391
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivПамять НЕ будет освобождаться .
Ты должен освобождать её самостоятельно,
это совершенно нормальное соглашение - память, занятую результатом, явно освобождает вызывающий


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

1) в его коде он ничего НЕ освобождал.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277392
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivмне кажется, что это абсолютно НЕнормальная ситуация, когда вызывающему надо еще о чем-то думать после вызова. а кто кроме вызывающего знает, как долго ему нужен результат вызова?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277394
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно спеке printf возвращает количество символов или негативное целое (статус ошибки).

Но если-бы он пробрасывал в качестве retval свой первый аргумент назад то
можно было бы попробовать в 1 строчку.

Код: plaintext
1.
delete[] printf(conv("abcdef"));
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277406
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИзопропилпропущено...

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


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

1) в его коде он ничего НЕ освобождал.
да как бы нормально вызывающему коду как раз думать и о выделении и о удалении :-)

был правда фокус с локальной переменной, но он потоконебезопасен
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277412
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я че-то подумал и сделал вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
char* conv(const char* sIn)
{
	static char* sOut=NULL;

	delete sOut;
	sOut = new char[strlen(sIn)+5];
	sprintf(sOut, "%s.out", sIn);
	return sOut;
}



По идее нормально же все будет работать? Вложенных вызовов не планирую.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277415
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooper, с точки зрения полезного действия всё что ты делаешь это просто форматирование
имени файла.

Код: plaintext
1.
2.
3.
char buf[256]; 
int offset = sprintf(buf,"abcdef");
offset += sprintf(buf + offset, ".out\0");
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277416
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, не... На самом деле функция другая, там происходит некое преобразование входной строки и выдается результат.
Это я для простоты такой пример привел.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277419
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperЯ че-то подумал и сделал вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
char* conv(const char* sIn)
{
	static char* sOut=NULL;

	delete sOut;
	sOut = new char[strlen(sIn)+5];
	sprintf(sOut, "%s.out", sIn);
	return sOut;
}



По идее нормально же все будет работать? Вложенных вызовов не планирую.

Вы уверены, что данный участок кода будет работать так, как вы вероятно полагаете? Мне кажется вы немного намудрили с ctrl+x, ctrl+v
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277420
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooper,
для чего вы используете квалификатор static?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277421
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooper,

Назовите хоть одну причину, чтобы использовать тут С-строки а не std::string?
Только не говорите что вам эту функцию надо вызывать миллионы раз в секунду, поэтому каждый такт важен

Код: plaintext
1.
2.
3.
4.
std::string conv(const std::string& in)
{
    return in + ".out";
}
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277422
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercuryдля чего вы используете квалификатор static?

Для многократного вызова этой функции внутри вызова других.
static нужен для сохранения указателя, чтобы при следующем вызове этой функции память, выделенная под предыдущий результат очищалась.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277423
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, я уже отвечал - функция на самом деле не такая простая и преобразований входной строки там гораздо больше.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277424
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooper , тоесть мы щас играемся в игрушки. А настоящую функцию
ты зажал и кормишь нас какими-то нелепыми синтетическими постановками.

И как-ты полученный опыт перенесёшь на свою волшебную функцию?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277425
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, ну суть вопроса-то была в очистке памяти при подобном вызове, а не в оптимизации моей функции :)
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277446
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperЯ че-то подумал и сделал вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
char* conv(const char* sIn)
{
	static char* sOut=NULL;

	delete sOut;
	sOut = new char[strlen(sIn)+5];
	sprintf(sOut, "%s.out", sIn);
	return sOut;
}



По идее нормально же все будет работать? Вложенных вызовов не планирую.
будет работать, тут только не нарвись на такое
Код: plaintext
1.
printf("%s, %s", conv("abc"), conv("def"));


Ошибок не будет, просто выведется второе дважды.

проверку добавь и скобки
Код: plaintext
1.
	if(sOut!=NULL) delete[] sOut;


А лучше на realloc() переделать
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]