powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет?
25 сообщений из 63, страница 2 из 3
Память будет освобождаться или нет?
    #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
25 сообщений из 63, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Память будет освобождаться или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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