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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2011, 12:04   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Расхождение адресов в конструкторе и деструкторе

Вот значимые отрывки кода
Код:
class MyClass
{
    public:
        MyClass()
        {
            c = ++x;
            cout << "In constructor with id = " << c << " " << this << endl;
        }
        ~MyClass()
        {
            cout << "In destructor with id = " << c << " " << this << endl;
        }
        void* operator new(size_t size) throw(bad_alloc);
        void* operator new[](size_t size) throw(bad_alloc);
        void operator delete(void* p) throw();
        void operator delete[](void* p) throw();
        static int x;
        int getId()
        {
            return c;
        }
    private:
        int c;
};


// ...

void* MyClass::operator new[](size_t size) throw(bad_alloc)
{
    void* p = malloc(size);
    cout << endl << "malloc = " << p << endl << endl;
    if ( !p )
    {
        throw new bad_alloc;
    }
    mainGC.addArrPtr(p,(size-4) / sizeof(MyClass));
    return p;
}


int main()
{
    try
    {
        MyClass* mc = new MyClass[3];
    }
    catch(bad_alloc* ba)
    {
        cout << "An bad_alloc exception" << endl;
        delete ba;
    }
    cin.get();
    mainGC.count();
    return 0;
}
Но получаем вот такой вывод...

Как видите, в начале у третьего элемента адрес 0x3e2514, а потом 0x3e2508. Почему так?
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 12:48   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Во-первых, вы выбрасываете не то, что указали:
Код:
void* MyClass::operator new[](size_t size) throw(bad_alloc)
{
    void* p = malloc(size);
    cout << endl << "malloc = " << p << endl << endl;
    if ( !p )
    {
        throw new bad_alloc;
    }
    mainGC.addArrPtr(p,(size-4) / sizeof(MyClass));
    return p;
}
Нафиг вам этот new? Делайте так: throw bad_alloc();
Во-вторых без строчки
Код:
mainGC.addArrPtr(p,(size-4) / sizeof(MyClass));
у меня все правильно работает (VS2008).
Что это за mainGC?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 13.08.2011, 14:03   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Во-первых, вы выбрасываете не то, что указали:
Это одно и то же. Если бы вбрасывал не то, что указал, была бы вызвана unexpected().
Цитата:
Что это за mainGC?
Ну, это объект класса(моего класса) GC, типа сборка мусора(ну, освобождение памяти, на которую ссылаются объекты класса MyClass).

Но это всё не то, я нашёл ошибку, и она кроется во внутренней части кода, которую я вам не привёл, как раз в реализации функции addArrPtr(). Так что всё исправлено, теперь всё норм. Сам пользую Code::Blocks 10.05.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 14:16   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

еще раз указываю что CodeBlocks это лишь редактор. говорите что MinGW используете.(у меня блокс подхватил студийный компиль)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2011, 14:21   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Пепел Феникса, я ЗНАЮ , что это редактор, но подразумеваю MinGW. Глупо юзать Code::Blocks с компилём VS.
Цитата:
(у меня блокс подхватил студийный компиль)
так там любой можно выбрать(который установлен).
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 14:36   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Глупо юзать Code::Blocks с компилём VS.
Глупо говорить одно, а подразумевать другое.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 13.08.2011, 14:42   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

а почему static int x; не определено ?
onewho вне форума Ответить с цитированием
Старый 13.08.2011, 14:45   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
а почему static int x; не определено ?
Статические переменные по умолчанию инициализируются нулем. Хотя на мой взгляд, все же лучше явно присваивать им значение
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 13.08.2011, 14:48   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тем не менее хрен знает какой компиль из списка вы выбрали.(может интеловский) просто называйте вещи своими именами. кстати версия редактора не имеет отношения к компилю.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2011, 14:51   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
кстати версия редактора не имеет отношения к компилю.
Рискну предположить, что это он тоже знает, просто подразумевал XXX версию MinGW, или чего он там использует
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка в конструкторе C++ Ver0nica Помощь студентам 1 24.04.2011 13:34
Нужно организовать формулу в конструкторе Ksy Microsoft Office Access 10 26.04.2010 20:53
Неявные данные в конструкторе. Lazio Общие вопросы C/C++ 4 12.04.2010 12:53
Конструктор в конструкторе Юра_YUYU Общие вопросы C/C++ 3 30.01.2010 15:32
Инициализация массивов в конструкторе. jojahti Общие вопросы C/C++ 7 27.07.2009 13:30