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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2011, 14:59   #11
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Статические переменные по умолчанию инициализируются нулем. Хотя на мой взгляд, все же лучше явно присваивать им значение
Моя студия 2008 другого мнения ...
http://www.cyberguru.ru/programming/...p3-page17.html
"Но описание статического члена - это только описание, и где-то в программе должно быть единственное определение для описываемого объекта или функции, например, такое:"
прямо в классе можно только const static определить. остальное неверно..
onewho вне форума Ответить с цитированием
Старый 13.08.2011, 15:06   #12
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Вот значимые отрывки кода
Код:
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. Почему так?
Я лишь могу предположить, что происходит. При "удалении" первых двух элементов массива, память на самом деле не удаляется. Только вызывается деструктор для этих элементов. При "удалении" последнего элемента массива нужно уже удалить всю память, выделенную под массив. То есть для третьего элемента массива выполняются две работы: вызов деструктора и удаление всей памяти, выделенной поод массив.
Когда память выделялась под масиив, то она имела префикс, в котором очевидно хранился размер массива. То есть сначала идут 4 байта с размером массива, а затем уже память, выделенная под его элементы. Так как нужно удалить всю память, то при "удалении" третьего элемента передается начальный реальный адрес выделенной памяти.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 13.08.2011, 15:18   #13
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
а почему static int x; не определено ?
Код:
Статические переменные по умолчанию инициализируются нулем. Хотя на мой взгляд, все же лучше явно присваивать им значение
Сказал же, привёл только значимую часть кода. Всё инициализируется.
Цитата:
Я лишь могу предположить, что происходит. При "удалении" первых двух элементов массива, память на самом деле не удаляется. Только вызывается деструктор для этих элементов. При "удалении" последнего элемента массива нужно уже удалить всю память, выделенную под массив. То есть для третьего элемента массива выполняются две работы: вызов деструктора и удаление всей памяти, выделенной поод массив.
Когда память выделялась под масиив, то она имела префикс, в котором очевидно хранился размер массива. То есть сначала идут 4 байта с размером массива, а затем уже память, выделенная под его элементы. Так как нужно удалить всю память, то при "удалении" третьего элемента передается начальный реальный адрес выделенной памяти.
Как это ни странно, но вы правы. Во внутренней части кода была именно такая ошибка. Но я ж сказал, исправил уже.
Цитата:
кстати версия редактора не имеет отношения к компилю.
FUUUUUUUU
Я знаю.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 20:31   #14
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

передумал по непонятным причинам

Последний раз редактировалось f.hump; 13.08.2011 в 20:35.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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