powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет?
63 сообщений из 63, показаны все 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
Память будет освобождаться или нет?
    #39277491
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
}



По идее нормально же все будет работать? Вложенных вызовов не планирую.
kealon(Ruslan)был правда фокус с локальной переменной, но он потоконебезопасен
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277492
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooper,

ох как часто этот велосипед придумывают
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277497
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)DeviLooper,

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

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

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

Код: plaintext
1.
delete[] printf(conv("abcdef"));



Вот я тоже про это хотел написать.
Но к сожалению C/C++ не Arch language.
Далеко не такой.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277549
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
}



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

Нет, ненормально.
В общем, это идиотский код и подход.
Даже с автоматическим (auto) массивом фиксированной длины лучше , чем так.
А как надо -- я уже показал.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277554
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLoopermayton, ну суть вопроса-то была в очистке памяти при подобном вызове, а не в оптимизации моей функции :)

Мы ответили ?
Ответили.
Зачем -- не понятно, если ты всё равно слушать не хочешь, а делаешь код только хуже.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277566
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
2.
3.
char *a = conv("bla-bla");
char *b = conv("ne bla-bla");
*a;


и получит USE AFTER DELETE... Счастливой отладки (
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277581
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, если очень не хочется STL использовать, то можно свой класс-обертку написать. Там немного кода будет.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277584
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа и вызывающему это знать не нужно.
Ему нужно взять значение и использовать.
no comments
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277587
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно некто постил ссылку на полную ненависти статью. Вобщем там было нечто вроде:
....История C/С++ это история создания строкового типа и т.п.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277602
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperЯ <stdio.h> юзаю, так что <string> раздувает бинарник со 130кб, до 500
Затестил, MS VC 2015 статическая линковка. Код отсюда 19432985 103424 байта, такой код 110592 байт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
std::string conv(const std::string& in)
{
	return in + ".out";
}

void main() {
	printf(conv("abcdef").c_str());
}


ХЗ стоит ли из-за 7 кб кода создавать столько граблей.

PS Раздутые бинарники хорошо сдувает UPX
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277623
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivДа и вызывающему это знать не нужно.
Ему нужно взять значение и использовать.
no comments
Ну так современный С++ идёт (несётся?) в эту сторону. Нам говорят: используйте value-семантику и "умные обёртки" для сырых указателей. Современный С++ код может вообще не содержать new и delete )
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277649
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <stdio.h>
#include <memory>

std::unique_ptr<char> conv(const char* sIn)
{
	std::unique_ptr<char> sOut(new char[strlen(sIn)+5]);
	sprintf(sOut.get(), "%s.out", sIn);
	return sOut;
}

int main()
{
puts(conv("abcdef").get());
}
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277653
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaНу так современный С++ идёт
катится :)

значит будет "старый" и "новый" C++
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277661
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneА так?
так 103936 байта, т.е. +512 байт всего.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277667
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga,

молодец, я вот понимаю, что это хрень, но почему это хрень - уже забыл, поскольку делал так последний раз лет 25 назад, когда был студентом...
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277670
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНедавно некто постил ссылку на полную ненависти статью. Вобщем там было нечто вроде:
....История C/С++ это история создания строкового типа и т.п.


а че не так что ли?
я всю жизнь (! не шутка) борюсь с этими хреновыми строками !
теперь хоть есть стандартная, да и то - говно полное...
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277684
Гость123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneА так?
Код: plaintext
1.
	std::unique_ptr<char> sOut(new char[strlen(sIn)+5]);



Есть подозрение, что std::unique_ptr<char> будет удалять через delete, а не delete[]
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277699
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость123BarloneА так?
Код: plaintext
1.
	std::unique_ptr<char> sOut(new char[strlen(sIn)+5]);



Есть подозрение, что std::unique_ptr<char> будет удалять через delete, а не delete[]

В такjм виде да, но кто мешает использовать custom delete для unique_ptr?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277710
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, они допилили unique_ptr для массивов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
template<

    class T,
    class Deleter = std::default_delete<T>
> class unique_ptr;
	(1) 	(since C++11)
template <

    class T,
    class Deleter
> class unique_ptr<T[], Deleter>;
	(2) 	(since C++11)



http://en.cppreference.com/w/cpp/memory/unique_ptr
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277712
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость123Есть подозрение, что std::unique_ptr<char> будет удалять через delete, а не delete[]
О...
Код: plaintext
1.
2.
3.
4.
5.
6.
std::unique_ptr<char[]> conv(const char* sIn)
{
	std::unique_ptr<char[]> sOut(new char[strlen(sIn)+5]);
	sprintf(sOut.get(), "%s.out", sIn);
	return sOut;
}
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277722
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А реально есть ли разница между delete *char и delete[] *char ?
если б это был массив объектов - понятно что надо деструктор каждому вызвать, но для char, int и т.п. этого не надо, а в итоге ведь наверняка что-то типа free(*void). Почему бы не узаконить взаимозаменяемость delete и delete[] для char?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277738
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tбудет работать, тут только не нарвись на такое
Код: plaintext
1.
printf("%s, %s", conv("abc"), conv("def"));


Ну под "вложенными" вызовами я в том числе это и имел в виду - не будет такого.

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


Скобки да, забыл. А проверка разве нужна? delete же сам проверяет на NULL.

MasterZivDeviLoopermayton, ну суть вопроса-то была в очистке памяти при подобном вызове, а не в оптимизации моей функции :)Мы ответили ? Ответили. Зачем -- не понятно, если ты всё равно слушать не хочешь, а делаешь код только хуже.
Да я имел в виду, что реальное тело той функции роли не играет. Меня интересовала только передача результата наружу.
Почему не слушаю? Слушаю, пробую. Просто мне показался мой вариант со статиком неплохим. Остальное все как-то громоздко...
А что в нем плохого? Что куча теребится? Ну у меня не так много вызовов.
Я понял, что это не по фэн-шую, что надо обвешиваться классами. Но такое решение имеет право на жизнь?
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277748
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperЯ понял, что это не по фэн-шую, что надо обвешиваться классами.
в сторону unique_ptr посмотри 19435532 он собственно именно для твоей задачи и создан, тут все по фэн-шую и накладных расходов минимум.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277749
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviLooperА что в нем плохого?
побочные эффекты
DeviLooperНо такое решение имеет право на жизнь?
кто ж запретит стрелять себе в ногу
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277755
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

Какой еще unique_ptr? Вы в своем уме? Он еще возьмет и применит это )))
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277756
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в нормальных функциях вызывающий буфер под результат передает. Ну и его размер, чтобы в ногу не выстрелить. А функция возвращает реальный размер результата или "не влезло" или потребный размер.
А так конечно, классы, фигассы, вектора, стринги :)
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277761
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyBarlone,

Какой еще unique_ptr? Вы в своем уме? Он еще возьмет и применит это )))
Почему нельзя std::unique_ptr<char[]> ? целиком тут 19435532
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277773
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TА реально есть ли разница между delete *char и delete[] *char ?
если б это был массив объектов - понятно что надо деструктор каждому вызвать, но для char, int и т.п. этого не надо, а в итоге ведь наверняка что-то типа free(*void). Почему бы не узаконить взаимозаменяемость delete и delete[] для char?Гипотетически, разница может быть. Например, при выделении памяти под объект без виртуального деструктора и не являющийся массивом, можно не сохранять размер выделенного блока.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277798
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivя всю жизнь (! не шутка) борюсь с этими хреновыми строками !
теперь хоть есть стандартная, да и то - говно полное...напиши свою. В соседней ветке [!] для велосипеда с параметрами, я сделал свою строку, она же пошла как универсальная прослойка между значением "любого" типа параметра и текстовым представлением.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277807
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПочему нельзя std::unique_ptr
Ну можно построить бассейн, но если человеку нужна ванна, то он ставит ванну.

Для работы со строками больше всего подходит std::string.
Все остальное - костыли.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39277823
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbMasterZivя всю жизнь (! не шутка) борюсь с этими хреновыми строками !
теперь хоть есть стандартная, да и то - говно полное...напиши свою. В соседней ветке [!] для велосипеда с параметрами, я сделал свою строку, она же пошла как универсальная прослойка между значением "любого" типа параметра и текстовым представлением.

Да я уже...
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39279505
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDeviLooper,

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

Код: plaintext
1.
2.
3.
4.
std::string conv(const std::string& in)
{
    return in + ".out";
}



По важности:
1я - у тебя программа на Си, а не на С++
2я - у тебя всегда здесь будет выделение памяти, а это далеко не "каждый такт".
Передавая и используя буфер вызывающей ф-ции, хоть на стеке, будет действительно быстрее.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* conv(char*buf, const char* sIn)
{
    strcpy(buf, sIn);
    return strcat(buf, ".out");
}
char buf[FILENAME_MAX+5];
printf(conv(buf, "abcdef"));


3я - хоть и редко, но size matters, можно сравнить размер с -lstdc++ и без него

Итого: или писать на С++ и решение АМ, или писать на Си.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39279648
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl1я - у тебя программа на Си, а не на С++
2я - у тебя всегда здесь будет выделение памяти, а это далеко не "каждый такт".
Ну так это изначальные условия.
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39279710
locked
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl2я - у тебя всегда здесь будет выделение памяти, а это далеко не "каждый такт".

Только если in.capacity() - in.size() < 4. Нормальные пацаны делают предварительно reserve() достаточный чтобы по возможности не вызывался realloc
...
Рейтинг: 0 / 0
Память будет освобождаться или нет?
    #39279785
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockedSiemargl2я - у тебя всегда здесь будет выделение памяти, а это далеко не "каждый такт".

Только если in.capacity() - in.size() < 4. Нормальные пацаны делают предварительно reserve() достаточный чтобы по возможности не вызывался reallocТам новый объект создается и возвращается. Нормальные пацаны учат матчасть.
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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