Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат адреса временной переменной 
V
    Опции темы
FCM
Дата 12.10.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Простой вопрос.

Код

int *func( int x ) { return &x; }


При использовании такой функции
MVC выдает предупреждение
warning C4172: returning address of local variable or temporary
, но считает правильно (в чем можно убедиться добавив в тело функции отладочную печать )

CodeBlocks + GCC не выдает предупреждение и считает правильно.

Так можно так делать?
PM MAIL   Вверх
zim22
Дата 12.10.2009, 10:58 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(FCM @  12.10.2009,  10:56 Найти цитируемый пост)
Так можно так делать?

нельзя


--------------------
PM MAIL   Вверх
Alek86
Дата 12.10.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



нет, нельзя
считает правильно потому, что значение локальной переменной (созданной на стеке и удаленной при выходе из функции) еще никем не перетирается

попробуй так
Код
#include <iostream>

int* func( int x ) {
    return &x;
}

int main() {
    int i = 20;
    int* pI = func(i);
    int j2[100] = {};
    std::cout << *pI;
}



--------------------
user posted image    user posted image
PM MAIL   Вверх
zim22
Дата 12.10.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



если очень хочется - то можно возвращать указатель на статическую переменную
Код

int* func( int x ) {
    static int sVal;
    sVal = x;
    return &sVal;
}

***
или на динамическую (только не забыть удалить потом)
Код

int* func( int x ) {
    return new int(x);
}


Это сообщение отредактировал(а) zim22 - 12.10.2009, 11:25


--------------------
PM MAIL   Вверх
FCM
Дата 12.10.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Спасибо!
PM MAIL   Вверх
Alek86
Дата 12.10.2009, 16:23 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(zim22 @  12.10.2009,  11:17 Найти цитируемый пост)
или на динамическую (только не забыть удалить потом)

лучше возвращать std::auto_ptr на эту переменную
это так, к слову smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
маерсон
Дата 13.10.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



а если так:
Код

char* GetCh()
{
  char* res = new char[128];
  return res;
}

это все к тому, чтобы отправить через сокет send(skt, GetCh(), 128, 0)
Так можно? Удалять-то не знаю где. Или тоже, желательно через std::auto_ptr?

Это сообщение отредактировал(а) маерсон - 13.10.2009, 11:32
PM MAIL   Вверх
niXman
Дата 13.10.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



Цитата(маерсон @  13.10.2009,  09:31 Найти цитируемый пост)
Удалять-то не знаю где

Удаляешь то, что вернула эта функция, после использования.

Цитата(маерсон @  13.10.2009,  09:31 Найти цитируемый пост)
Или тоже, желательно через std::auto_ptr?

Да.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
маерсон
Дата 13.10.2009, 12:02 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



А как удалять правильно, где ни читаю - мнения расходятся:
где просто 
Код

delete[] res;

а где
Код

delete res;
res = NULL;

Говорят, что delete[] не высвобождает память.  smile 
PM MAIL   Вверх
zim22
Дата 13.10.2009, 12:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(маерсон @  13.10.2009,  12:02 Найти цитируемый пост)
А как удалять правильно, где ни читаю - мнения расходятся:

если квадратные скобочки в new были - то и в delete они должны быть
иначе - обычный delete
Цитата(маерсон @  13.10.2009,  12:02 Найти цитируемый пост)
Говорят, что delete[] не высвобождает память. 

кто? голоса у тебя в голове?

Это сообщение отредактировал(а) zim22 - 13.10.2009, 12:21


--------------------
PM MAIL   Вверх
niXman
Дата 13.10.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



Цитата(маерсон @  13.10.2009,  10:02 Найти цитируемый пост)
Говорят, что delete[] не высвобождает память.

пруфлинк дай.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
маерсон
Дата 13.10.2009, 12:41 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



niXman, линк чего? ответ на официальный запрос СМИ?

http://www.daniweb.com/forums/thread46675.html

Это сообщение отредактировал(а) маерсон - 13.10.2009, 12:55
PM MAIL   Вверх
zim22
Дата 13.10.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(маерсон @  13.10.2009,  12:41 Найти цитируемый пост)
http://www.codersource.net/c++_memory_leaks.aspx

ну и что? статья как статья. на английском. говорится в ней о том, как делать нельзя и как можно. всё там правильно.

маерсон, учи английский smile


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0851 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.