Информация об изменениях

Сообщение Re[5]: return char* от 11.03.2017 18:30

Изменено 11.03.2017 18:32 Carc

Re[5]: return char*
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Carc, Вы писали:


Pzz>>>Вызывающая функция освобождает стек только от того, что она сама туда напихала. Но не от того, что туда напихала вызываемая функция.

C>>Согласен, но в том и "фишка" что указатель на локальную переменную после выхода из вызываемой дол
жен остаться валидным в вызывающей функции... Ну, понятно, это все равно "хак".

Pzz>Никому он ничего не должен.

Ну-у-у, началось словоблудие знакомое… Кто спорил то!?! Попытки вернуть адрес локальной переменной из функции и так понятно к чему приводит. Я о другом вообще говорил! Что в данном конкретном примере, при таком соглашение вызовов cdecl, по вернутому таким некошерным способом указателе будут запросто тем не менее лежать валидные данные.

И только всего! Это все, что я хотел сказать. Что с ним делать, с таким "некошерно" вёрнутым указателем, решать вызывающей функции. Ежу же понятно, что нужно сразу данные по нему куда-то "скопистить".

Такой же вариант бы сработал

char* const p=Sum();//вот тут мы получили этот абсолютно неверный указатель

//но его сразу нужно забрать, а не потом когда-нибудь
if (NULL(nullptr) == p)
    throw "Идите в опу"; т.е. если указатель не валидный дальше вообще никаких переговоров

//или сразу его забираем себе
const std::string wowPtr(p);//все - забрали указатель


Если разговор в стиле топик-стартера, то ответ простой. Никак. Так нельзя. Нельзя использовать адрес локальной переменной после выхода из функции.

Если разговор как надо? Опять же ответ простой. Поиск по КЫВТ. 100 раз обсуждали. Подходов тыщи. А по сути их всего два. Остальных нет. Я не спроста написал, в первом же посте, что тот пример, который я показал, работать-то будет. Но так никогда не стоит делать.
Re[5]: return char*
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Carc, Вы писали:


Pzz>>>Вызывающая функция освобождает стек только от того, что она сама туда напихала. Но не от того, что туда напихала вызываемая функция.

C>>Согласен, но в том и "фишка" что указатель на локальную переменную после выхода из вызываемой дол
жен остаться валидным в вызывающей функции... Ну, понятно, это все равно "хак".

Pzz>Никому он ничего не должен.

Ну-у-у, началось словоблудие знакомое… Кто спорил то!?! Попытки вернуть адрес локальной переменной из функции и так понятно к чему приводит. Я о другом вообще говорил! Что в данном конкретном примере, при таком соглашении вызовов cdecl, по вернутому таким некошерным способом указателе будут запросто тем не менее лежать валидные данные.

И только всего! Это все, что я хотел сказать. Что с ним делать, с таким "некошерно" вёрнутым указателем, решать вызывающей функции. Ежу же понятно, что нужно сразу данные по нему куда-то "скопистить".

Такой же вариант бы сработал

char* const p=Sum();//вот тут мы получили этот абсолютно неверный указатель

//но его сразу нужно забрать, а не потом когда-нибудь
if (NULL(nullptr) == p)
    throw "Идите в *опу"; //т.е. если указатель не валидный, дальше вообще никаких переговоров

//или сразу его забираем себе
const std::string wowPtr(p);//все - забрали указатель


Если разговор в стиле топик-стартера, то ответ простой. Никак. Так нельзя. Нельзя использовать адрес локальной переменной после выхода из функции.

Если разговор как надо? Опять же ответ простой. Поиск по КЫВТ. 100 раз обсуждали. Подходов тыщи. А по сути их всего два. Остальных нет. Я не спроста написал, в первом же посте, что тот пример, который я показал, работать-то будет. Но так никогда не стоит делать.