Свой operaor new и глобалные объекты
От: Аноним  
Дата: 30.05.11 07:35
Оценка:
У меня переопределен operator new и operator delete
Падение программы происходит на operator delete, когда ему дается указатель на объект, который был выделен не через мой operator new
Выяснил, что объект этот — глобалный и создается до вызова main.

Но почему-то убивается он через мой delete

Как это разрулить?

PS. Не переопрелделять new не предлагать, это не мной писано и там много чего на этом основано, но что эти new и delete рабочие — это стопроцентно
Re: Свой operaor new и глобалные объекты
От: abdab Россия  
Дата: 30.05.11 08:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня переопределен operator new и operator delete

А>Падение программы происходит на operator delete, когда ему дается указатель на объект, который был выделен не через мой operator new
А>Выяснил, что объект этот — глобалный и создается до вызова main.

А>Но почему-то убивается он через мой delete


А>Как это разрулить?


А>PS. Не переопрелделять new не предлагать, это не мной писано и там много чего на этом основано, но что эти new и delete рабочие — это стопроцентно


У меня что-то подобное было, правда для embedded системы.
Смотрите на все объекты ваших классов, которые создаются не из кучи, то есть глобальные стековые объекты. Так вот смотрите на их конструкторы, создаются ли там новые объекты, если да — то в этом и проблема, потому что до функции main в некоторых случаях используются стандартные не переопределенные функции и операторы для работы с кучей, а инициализация глобальных объектов происходит именно до функции main. Но это скорее всего правомерно только для некоторых embedded компиляторов. Так что второй вариант: кто-то явно вызывает delete для стекового объекта, смотрите стек вызова.
Re: Свой operaor new и глобалные объекты
От: uzhas Ниоткуда  
Дата: 30.05.11 10:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Выяснил, что объект этот — глобалный и создается до вызова main.


А>Но почему-то убивается он через мой delete

не встречал такого поведения ни под виндой и ни под линуксом
опишите как именно был определен оператор new\delete, сколько бинарных модулей у вашей программы? есть длл? какой компилятор, версия, операционная система?
спасибо
Re[2]: Свой operaor new и глобалные объекты
От: Аноним  
Дата: 30.05.11 10:30
Оценка:
Здравствуйте, uzhas, Вы писали:

U>опишите как именно был определен оператор new\delete, сколько бинарных модулей у вашей программы? есть длл? какой компилятор, версия, операционная система?


Ну в этих операторах ссылки считаются, чтобы утечки ловить. Еще в этих операторах память выделяется выравненная на 16
Прога написана на Qt, но в неё встроен еще графический движок, не на Qt написаннный. Сам движок не в DLL, а исходниками встроен в программу. Вот этот движок собственно и переоприеделяет операторы
MSVC 2010
Re[3]: Свой operaor new и глобалные объекты
От: uzhas Ниоткуда  
Дата: 30.05.11 10:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, uzhas, Вы писали:


U>>опишите как именно был определен оператор new\delete, сколько бинарных модулей у вашей программы? есть длл? какой компилятор, версия, операционная система?


А>Ну в этих операторах ссылки считаются,

что за ссылки? объектов ведь нет у этих операторов. обычно трекают стектрейс аллокаций и объем памяти, при выходе приложения всю память дампят в виде репорта.
A> чтобы утечки ловить.
ну это распространенный сценарий
А>Прога написана на Qt, но в неё встроен еще графический движок, не на Qt написаннный. Сам движок не в DLL, а исходниками встроен в программу. Вот этот движок собственно и переоприеделяет операторы
А>MSVC 2010
Qt в виде длл или в виде статической либы? у вас монолитный ехе? рантайм статический? что за движок?
может пример кода приведете?
все же тут надо глубже копать, без доп. данных тяжело телепатировать
Re[4]: Свой operaor new и глобалные объекты
От: uzhas Ниоткуда  
Дата: 30.05.11 10:44
Оценка:
Здравствуйте, uzhas, Вы писали:

кстати, сам Qt не переопределил эти операторы? может, у вас оба движка их попытались переопределить?
Re[4]: Свой operaor new и глобалные объекты
От: Аноним  
Дата: 30.05.11 10:51
Оценка:
Здравствуйте, uzhas, Вы писали:

U>что за ссылки? объектов ведь нет у этих операторов. обычно трекают стектрейс аллокаций и объем памяти, при выходе приложения всю память дампят в виде репорта.


Там вокруг каждого объекта, аллоциируемого через new создается некая надстройка, которая содержит выделенный размер и следующий и предыдущий свободный и занятые блоки. И анализ и удаление потом через ути надстройки идет

U>Qt в виде длл или в виде статической либы? у вас монолитный ехе? рантайм статический? что за движок?


В виде DLL. Движок внутри проги, не отдельно. Движок — C4

U>может пример кода приведете?


Ну вот например new вызывает вот эту функцию

MemBlockHeader *NewMemBlock(unsigned long logicalSize, unsigned long flags)
{
    MemBlockHeader        *newBlock;
    MemBlockHeader        *freeBlock;
    
    if (logicalSize > maxBlockSize) return (MemoryMgr::NewSystemBlock(logicalSize, flags));
    
    heapMutex.Acquire();
    
    unsigned long physicalSize = MemoryMgr::GetPhysicalSize(logicalSize);
    unsigned long combinedSize = physicalSize + sizeof(MemBlockHeader);
    unsigned long index = GetFreeListIndex(combinedSize);
    
    for (unsigned_machine a = kMemoryFreeListCount - 1; a > index; a--)
    {
        freeBlock = firstFreeBlock[a];
        if (freeBlock)
        {
            newBlock = SplitMemBlock(freeBlock, logicalSize, physicalSize, flags, a);
            goto end;
        }
    }
    
    freeBlock = firstFreeBlock[index];
    while (freeBlock)
    {
        if (freeBlock->physicalSize >= combinedSize)
        {
            newBlock = SplitMemBlock(freeBlock, logicalSize, physicalSize, flags, index);
            goto end;
        }
        
        freeBlock = freeBlock->nextFreeBlock;
    }
    
    newBlock = NewMemPool(logicalSize, flags)->GetFirstBlock();
    
    end:
    totalSize += logicalSize;
    heapMutex.Release();
    return (newBlock);
}
Re[5]: Свой operaor new и глобалные объекты
От: uzhas Ниоткуда  
Дата: 30.05.11 11:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В виде DLL. Движок внутри проги, не отдельно. Движок — C4

можете показать о каком глобальном объекте идет речь? как и кто его создал и как он уничтожается и на какой фазе?
движок C4 вроде навязывает делать интрузивные new\delete в классах. возможно, здесь какие-то проблемы возникли. например, heap движка еще не был готов к созданию глобального объекта и создал объект как смог (через глобальный new). ваш глобальный объек имеет свои собственные перегруженные функции new\delete ? от движка C4 или свои какие-то
зы: исходники C4 не могу найти, потыкал лишь офиц сайт
Re[6]: Свой operaor new и глобалные объекты
От: Аноним  
Дата: 30.05.11 11:11
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Аноним, Вы писали:


А>>В виде DLL. Движок внутри проги, не отдельно. Движок — C4

U>можете показать о каком глобальном объекте идет речь? как и кто его создал и как он уничтожается и на какой фазе?
U>движок C4 вроде навязывает делать интрузивные new\delete в классах. возможно, здесь какие-то проблемы возникли. например, heap движка еще не был готов к созданию глобального объекта и создал объект как смог (через глобальный new). ваш глобальный объек имеет свои собственные перегруженные функции new\delete ? от движка C4 или свои какие-то
U>зы: исходники C4 не могу найти, потыкал лишь офиц сайт

Это движковый же объект. Причем если просто запускать движок отдельно, в виде демо-игры (там все без Qt), то все нормально. Но я встроил его в Qt прогу — вот тут и начались проблемы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.