Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
Утечки там не будет, если только компилятор не волшебный. Это visual c++ функция, ну для кодеров может быть и не заменимая
PHP код: <?php
string test() {
return "test string"
}
void work(string_view test) {
//работа с строкой
}
work(test())
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Gattsu Написал:Утечки там не будет, если только компилятор не волшебный. Это visual c++ функция, ну для кодеров может быть и не заменимая
PHP код: <?php
string test() {
return "test string"
}
void work(string_view test) {
//работа с строкой
}
work(test())
Какой интересный код. А work("test string") не проще будет?
Если вы считаете, что такое имеет место быть для обсуждения, так предложите собственные уроки по мастер классу - что и как делать не комильфо, а что является моветоном. И что правильно, а что нет.
А так, бред какой-то абстрактный пишите.
Родился, живу и когда-нибудь умру.
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
Donatte Написал:Какой интересный код. А work("test string") не проще будет? 
Если вы считаете, что такое имеет место быть для обсуждения, так предложите собственные уроки по мастер классу - что и как делать не комильфо, а что является моветоном. И что правильно, а что нет.
А так, бред какой-то абстрактный пишите.
Ну просто тут туева туча экспертов во всех областях, я прям в академию наук попал.
Ситуация обрисовывает сложность работы с память, в данном случае это условность. Демонстрирует проблемы с временем жизни переменной, в данной ситуации когда, в стек записывается указатель на строку, но после
возврата указатель может оказаться не валидным, затереться другим значением. В рамках данной ситуации это практически невозможно, но если подобный код будет использовать в среде с высокой конкуренцией, где тысячи нитей исполнения, может быть ой как бо-бо, а такие участки очень тяжело отследить, тут он тривиальный.
Для вас бред, а для людей, которые этим профессионально занимаются, в с++ это основная проблема
Вопрос демонстрирует не компетенцию, всем хочется дать глупый совет, что во всем разбираетесь лучше всех и что ни кто не знает. Уважаемые это основа. Русское комюнити очень отличается на фоне всех, жадностью и зазнайством
Сообщений: 526
Тем: 28
Зарегистрирован: Oct 2009
Репутация:
7,209
08-10-2015, 09:40 PM
(Сообщение последний раз редактировалось: 08-10-2015, 10:07 PM Smiler.)
Gattsu Написал:Утечки там не будет
PHP код: <?php
char* test() {
return "test";
}
в данном случае это утечка. память занятая под "test string" не высвободится по выходу из функции. в том числе в любой "среде с высокой конкуренцией, где тысячи нитей исполнения"
а вот так уже нет утечки но есть невалидный указатель:
PHP код: <?php
char* test() {
char s[100]="test";
return s;
}
а причина в том что преобразование типов компилятора visual c++ делает так:
"test"
это не char* а const char*
а как всем вроде известно
"const переменные размещаются в области памяти предназначенной только для чтения."
и никакая "среда с высокой конкуренцией, где тысячи нитей исполнения" не может записать в блок памяти предназначенный для чтения. ну только если не сменить специально сегмент данных.
Добавлено через 14 минут
ну и если все таки остались сомнения то пожалуйста проверьте
Код: char * test1()
{
char s[100] = "test";
return s;
}
char * test2()
{
return "test";
}
int main()
{
char * x = test1();
*x = 'T'; // Тут 1000 нитей перепишет значение в памяти
x = test2();
*x = 'T'; // а тут будет исключение
return 0;
}
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Gattsu Написал:Ну просто тут туева туча экспертов во всех областях, я прям в академию наук попал.
"Бери ношу по себе, чтобы не падать при ходьбе." Иными словами - начали тему за мёртвый код, продолжайте и не зазнавайтесь своими ребусами. Пишите частые ошибки в коде и разбирайте их.
Gattsu Написал:Для вас бред, а для людей, которые этим профессионально занимаются, в с++ это основная проблема
Люди, которые занимаются этим профессионально могут допускать такие ошибки только от сильного переутомления. Ибо всё основное они обрисовывают крайне быстро и не плодят глупый код с пометкой "потом допилю и отшлифую". А в последующем дебаге приложения естественно следят за памятью. Нет?
Gattsu Написал:Русское комюнити очень отличается на фоне всех, жадностью и зазнайством
Это харизма русского коммюнити. Если её убрать, то оно умрёт. Писать почему именно так не буду. Все про это знают.
Родился, живу и когда-нибудь умру.
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
08-10-2015, 11:46 PM
(Сообщение последний раз редактировалось: 08-10-2015, 11:59 PM Gattsu.)
MHard Написал:PHP код: <?php
char* test() {
return "test";
}
в данном случае это утечка. память занятая под "test string" не высвободится по выходу из функции. в том числе в любой "среде с высокой конкуренцией, где тысячи нитей исполнения"
а вот так уже нет утечки но есть невалидный указатель:
PHP код: <?php
char* test() {
char s[100]="test";
return s;
}
а причина в том что преобразование типов компилятора visual c++ делает так:
"test"
это не char* а const char*
а как всем вроде известно
"const переменные размещаются в области памяти предназначенной только для чтения."
и никакая "среда с высокой конкуренцией, где тысячи нитей исполнения" не может записать в блок памяти предназначенный для чтения. ну только если не сменить специально сегмент данных.
Добавлено через 14 минут
ну и если все таки остались сомнения то пожалуйста проверьте
Код: char * test1()
{
char s[100] = "test";
return s;
}
char * test2()
{
return "test";
}
int main()
{
char * x = test1();
*x = 'T'; // Тут 1000 нитей перепишет значение в памяти
x = test2();
*x = 'T'; // а тут будет исключение
return 0;
}
ЧТД
Могу узнать Вы занимаетесь профессионально, в IT сфере? Если да, то идите печь пирожки
Вы слышите что я говорю про потерю указателя, затирание, на указываемую область памяти
Для одаренных людей
PHP код: <?php
string get_url() {
return "http://site-dlya-odarenih-ludey-i-porno.vata";
}
string_view get_scheme_from_url(string_view url) {
unsigned colon = url.find(':');
return url.substr(0, colon);
}
int main() {
auto scheme = get_scheme_from_url(get_url());
cout << scheme << endl;
return 0;
}
Эту проблему описываю не я, а люди умнее меня, можете пройти мимо и не показывать свою глупость?
ПС Я знаю что такое указатель на не изменяемую область памяти, читай что пишу не ищите скрытого смысла. Есть такое понять чтение, а может надо подсчитать количество элементов в строке? Ужас просто
ПСС Писать как можно не нужно, показывая глупость. Это пример демонстрирующий очень сложную ситуацию, где может произойти не то что нужно,
Добавлено через 12 минут
Donatte Написал:Люди, которые занимаются этим профессионально могут допускать такие ошибки только от сильного переутомления. Ибо всё основное они обрисовывают крайне быстро и не плодят глупый код с пометкой "потом допилю и отшлифую". А в последующем дебаге приложения естественно следят за памятью. Нет? ну-ну, прям роботы, почему тогда нету идеального ПО, хотя вот оно.
Делает, то что от него ждут
int main() { cout << 1 + 1 << endl; return 0; }
Вы явно не сталкивались с недельной отладкой, где ошибка скрывалась в ошибке округления ieee754 стандарта, когда накапливается погрешности, и потом все к чертям. Такие места проявляться могут через месяц, а то и год, работы. Кто что там писал уже не помнят. Я видел программный продукт, с нагромождением 15 лет разработки, вот это хардкор отладки.
Заострю внимание cстандарт с плавающей точкой, которому хер знает сколько лет, а ошибка там. "Снимите розовые очки"
Любая система может дать сбой по той или иной причине, ошибка в ос, ошибка в используемых библиотека, ошибка в компиляторе, целая цепока. При это не возможно отследить эти ошибки автоматически, нету интеллектуального по, в принципе, которое способно на это.
Donatte Написал:Это харизма русского коммюнити. Если её убрать, то оно умрёт. Писать почему именно так не буду. Все про это знают.
Это невежество и глупость русского комюнити, я про IT сферу.
Сообщений: 526
Тем: 28
Зарегистрирован: Oct 2009
Репутация:
7,209
сколько гонора :ugar:
Вы спрашивали в чем проблема данного кода
char* test() {
return "test";
}
а теперь тулите
string get_url() {
return "http://site-dlya-odarenih-ludey-i-porno.vata";
}
char * и std:  tring это не одно и тоже во втором случае это даже не указатель на экземпляр класса а сам экземпляр класса
так вот в чем проблема данного кода я сказал, и подтвердил.
если можете аргументировать то вперед, а выражения "Писать как можно не нужно" наталкивает на ваше родство с кличко. "не только лиш каждый может смотреть в завтрашний день?"
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
MHard Написал:сколько гонора :ugar:
Вы спрашивали в чем проблема данного кода
char* test() {
return "test";
}
а теперь тулите
string get_url() {
return "http://site-dlya-odarenih-ludey-i-porno.vata";
}
char * и std: tring это не одно и тоже во втором случае это даже не указатель на экземпляр класса а сам экземпляр класса
так вот в чем проблема данного кода я сказал, и подтвердил.
если можете аргументировать то вперед, а выражения "Писать как можно не нужно" наталкивает на ваше родство с кличко. "не только лиш каждый может смотреть в завтрашний день?" Пирожки говорю ни как иначе
return "test" остался, остался и указатель на строку. Можно оставить указатель, вы тут начинаете сежать, я же просил не показывать глупость, есть такая вещь неявное преобразование. Ну уже сказали что тут переполнение памяти, хоть это не так так как это литерал константа строка и она храниться в data в ELF или EXE без разницы
Сообщений: 526
Тем: 28
Зарегистрирован: Oct 2009
Репутация:
7,209
Gattsu Написал:Пирожки говорю ни как иначе
return "test" остался, остался и указатель на строку. Можно оставить указатель, вы тут начинаете сежать, я же просил не показывать глупость, есть такая вещь неявное преобразование. Ну уже сказали что тут переполнение памяти, хоть это не так так как это литерал константа строка и она храниться в data в ELF или EXE без разницы
ооо
это
string get_url() {
return "http://site-dlya-odarenih-ludey-i-porno.vata";
}
эквивалентно этому
string get_url() {
string str = "http://site-dlya-odarenih-ludey-i-porno.vata";
return str;
}
и этому
string get_url() {
string a("http://site-dlya-odarenih-ludey-i-porno.vata");
return a;
}
разницу улавливаеш как срабатывает преобразование типов ? XD
в данном случае "http://site-dlya-odarenih-ludey-i-porno.vata" передается в конструктор класса string
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
MHard Написал:ооо
это
string get_url() {
return "http://site-dlya-odarenih-ludey-i-porno.vata";
}
эквивалентно этому
string get_url() {
string str = "http://site-dlya-odarenih-ludey-i-porno.vata";
return str;
}
разницу улавливаеш как срабатывает преобразование типов ? XD
кто мой код еще переделывает, я привел конкретный пример,
Вы тупы? У вас проблем врач не обнаружил?
Привер
return "sddasasdsadsaddsa"
просто пздц пройдите мимо
Люди у которых докторские степени и Вы? не чувствуете разницы? Которые разрабатывают системы которые используете Вы? Вам лишь бы поспорить?
|