Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет? / 25 сообщений из 63, страница 1 из 3
20.07.2016, 20:52
    #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
20.07.2016, 20:59
    #39277358
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
Потечет. Каждому new должен быть в конце delete, иначе память занята до конца работы приложения.
...
Рейтинг: 0 / 0
20.07.2016, 21:00
    #39277359
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
Лучше используй string тогда проблем с памятью не будет.
...
Рейтинг: 0 / 0
20.07.2016, 21:02
    #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
20.07.2016, 21:49
    #39277371
DeviLooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
Dima Tиспользуй string
string, конечно, вещь удобная, но уж слишком раздувает бинарник. Vector в этом плане выглядит привлекательнее.

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

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

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

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


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


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

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

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

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

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


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

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

был правда фокус с локальной переменной, но он потоконебезопасен
...
Рейтинг: 0 / 0
21.07.2016, 00:31
    #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
21.07.2016, 01:11
    #39277415
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
DeviLooper, с точки зрения полезного действия всё что ты делаешь это просто форматирование
имени файла.

Код: plaintext
1.
2.
3.
char buf[256]; 
int offset = sprintf(buf,"abcdef");
offset += sprintf(buf + offset, ".out\0");
...
Рейтинг: 0 / 0
21.07.2016, 01:16
    #39277416
DeviLooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
mayton, не... На самом деле функция другая, там происходит некое преобразование входной строки и выдается результат.
Это я для простоты такой пример привел.
...
Рейтинг: 0 / 0
21.07.2016, 02:20
    #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
21.07.2016, 02:26
    #39277420
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
DeviLooper,
для чего вы используете квалификатор static?
...
Рейтинг: 0 / 0
21.07.2016, 02:30
    #39277421
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
DeviLooper,

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

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

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

И как-ты полученный опыт перенесёшь на свою волшебную функцию?
...
Рейтинг: 0 / 0
21.07.2016, 03:14
    #39277425
DeviLooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Память будет освобождаться или нет?
mayton, ну суть вопроса-то была в очистке памяти при подобном вызове, а не в оптимизации моей функции :)
...
Рейтинг: 0 / 0
21.07.2016, 07:10
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет? / 25 сообщений из 63, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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