none
Утечка памяти, Указатели. RRS feed

  • Вопрос

  • #include<iostream>
    using namespace std;
    class Cat
    {
    public:
     Cat(int age) { itsAge = age; }
     ~Cat () {}
     int GetAge() const { return itsAge; }
    private:
     int itsAge;
    };
    Cat * MakeCat(int age);
    int main()
    {
     int age = 7;
     Cat * Boots = MakeCat(age);
     cout << "Boots is " << Boots->GetAge() << " years old." << endl;
     cout << "&Boots " << &Boots << endl;
     delete Boots;
     return 0;
    }
    Cat * MakeCat(int age)
    {
     Cat * pCat = new Cat(age);
     cout << "&pCat " << &pCat << endl;
     return pCat;
    }

    Кто подскажет? Почему Адрес указателя Boots, созданного в main(), и адрес указателя pCat созданного в Cat * MakeCat(int age) не совподают? По моему плану указатель pCat из фенкции должен передавать свой адрес в main(), и этот адрес должен присваеваться вновь созданному указателю Boots. В итоге память, выделенная в функции не освобождается, и при операции delete Boots удоляется непонятно что. Целый день думал. Ни как не могу понять.

    • Перемещено SachinW 1 октября 2010 г. 22:15 MSDN Forums Consolidation (От:Начинающие разработчики)

Ответы

  • #include<iostream>
    
    using namespace std;
    
    class Cat
    {
    public:
     Cat(int age) { itsAge = age; }
     ~Cat () {}
     int GetAge() const { return itsAge; }
     ptrdiff_t GetPointer() // вернем указатель на себя из класса
     {
      return reinterpret_cast<ptrdiff_t>(this);
     }
    private:
     int itsAge;
    };
    
    Cat * MakeCat(int age);
    int main()
    {
     int age = 7;
     Cat * Boots = MakeCat(age);
     cout << "Boots is " << Boots->GetAge() << " years old." << endl;
     cout << "&Boots " << &Boots << endl;
     cout << "&Boots from my class " << Boots->GetPointer() << endl;
     delete Boots;
     return 0;
    }
    Cat * MakeCat(int age)
    {
     Cat * pCat = new Cat(age);
     cout << "&pCat " << &pCat << endl;
     cout << "&pCat from my class " << pCat->GetPointer() << endl;
     return pCat;
    }

    а так работает? правильно возвращает все? :)

     

    утечки памяти у тебя не было! если бы была - то это смещение не дало бы вызвать

    Boots->GetAge()
    • Предложено в качестве ответа mixkorshun 31 мая 2010 г. 2:55
    • Изменено mixkorshun 31 мая 2010 г. 2:59 дополнение
    • Помечено в качестве ответа I.Vorontsov 31 мая 2010 г. 4:38