Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 10:18   #1
ZanLeO
 
Регистрация: 09.08.2010
Сообщений: 6
По умолчанию Найти и исправить ошибку. (Ссылки, указатели, утечка памяти) С,С++

Дано: код программы, в которой есть ошибка.
Задание: Найти и обезвредить.

Код:
# include <iostream>
using namespace std;

class newClass {
      public:
             nc(int var) {itsVar=var;}
             ~nc(){}
             int GetVar() const {return itsVar;}
      private:
              int itsVar;
      };

nc & cnewClass(int var);

int main () {
int var = 7;
newClass Boo = Mnc(var);
cout << "Boo = " << Boo.GetVar() << endl;

return 0;
}

nc & cnewClass(int var)
{
     newClass * pClass = new  newClass(var);
     return *pClass;
}
PS Из ошибок нашёл вроде только утечку памяти! как корректно её исправить?

Последний раз редактировалось Stilet; 09.08.2010 в 10:23.
ZanLeO вне форума Ответить с цитированием
Старый 09.08.2010, 10:50   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Код:
# include <iostream>

class newClass {
public:
    newClass(int var)
	: itsVar( var ){
    }
    int GetVar() const {
	return itsVar;
    }
private:
    int itsVar;
};

// а вообще, лучше такого совсем не делать
newClass* cnewClass(int var){
    return ( new  newClass(var) );
}

int main () {
    const int var = 7;
    newClass *Boo = cnewClass( var );
    std::cout << "Boo = " << Boo->GetVar() << std::endl;
    delete Boo;
}
У меня так получилось оО
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 09.08.2010, 11:31   #3
ZanLeO
 
Регистрация: 09.08.2010
Сообщений: 6
По умолчанию

Простите - я начинающий, поэтому не совсем ясно вот это:
newClass(int var) : itsVar( var ){ }

Можно ли с созданием переменно (объекта), а не указателя на оную?
будет ли верно следующее:
Код:
int main () {
int var = 7;
newClass Boo = Mnc(var);
cout << "Boo = " << Boo.GetVar() << endl;
delete Boo; //Ведь Boo указывает на начало объекта... или будет ли верно delete &Boo?
return 0;
}

newClass & cnewClass(int var)
{
     newClass * pClass = new  newClass(var);
     return *pClass;
}

Последний раз редактировалось Stilet; 09.08.2010 в 12:04.
ZanLeO вне форума Ответить с цитированием
Старый 09.08.2010, 11:45   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Нет, у нас есть локальный обьект Boo.
с delete Boo; даже не скомпилируется, и да, я особо не вижу смысла в данном методе, если возвращается ссылка, указатель возвращать как-то более феншуйно.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 09.08.2010, 11:50   #5
ZanLeO
 
Регистрация: 09.08.2010
Сообщений: 6
По умолчанию

Ладно, спасибо!)
я просто учебничек читал и наткнулся на эту "задачку".
Не был уверен, что это именно утечка.
ZanLeO вне форума Ответить с цитированием
Старый 09.08.2010, 11:56   #6
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Можешь сделать что-то типа такого класса :
Код:
Check{
public:
   Check( const Check &check )
     : value( check.value + '\'' ){
       std::cout << "constructor : " << value << '\n';
   }
   Check( const std::string &initString )
     : value( initString ){
       std::cout << "Constructor : " << value << '\n';
   }
   ~Check(){
       std::cout << "Destructor : " << value << '\n';
   }
protected:
   std::string value;
};
Ну еще operator= можно при желании перегрузить.
И с помощью него проверяй, кол-во вызванных деструкторов и конструкторов, если не уверен в чем-то
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux

Последний раз редактировалось ozo; 09.08.2010 в 12:01.
ozo вне форума Ответить с цитированием
Старый 09.08.2010, 12:30   #7
ZanLeO
 
Регистрация: 09.08.2010
Сообщений: 6
По умолчанию

Хм...спасибо, но всё-таки не дождался пояснения об оной строчке... я не могу её понять(((
Цитата:
Check( const Check &check )
: value( check.value + '\'' ){
std::cout << "constructor : " << value << '\n';
}
Я понимаю, что мы говорим о конструкторе Check с параметром, но что значит последующее
Цитата:
: value( check.value + '\'' )
?
ZanLeO вне форума Ответить с цитированием
Старый 09.08.2010, 12:45   #8
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

гугл :
список инициализации C++
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 09.08.2010, 13:00   #9
ZanLeO
 
Регистрация: 09.08.2010
Сообщений: 6
По умолчанию

Огромное спасибо!)
Было полезно почитать!)
ZanLeO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение к эелементам двумерного массива через указатели на С ++ помогите понять как исправить ошибку серг Общие вопросы C/C++ 3 09.08.2010 12:37
[C] лабораторка. Указатели на функции. Помогите исправить ошибку) KrL^^ Помощь студентам 2 11.03.2009 22:33
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24
DrawState - утечка памяти? unnamed Win Api 2 11.04.2007 18:36