Разрушение в DSFML2

(Составлено с dmd v2.051)

Код такой:


import dsfml.graphics.all;

void main()
{   
    while(true)
        auto rect = new Image(1024, 1024);
}

Ошибки выходят через минуту, выбрасывая исключение. Я предполагаю, что это из-за утечек памяти.

С другой стороны, такой код, как этот, вызывает нарушения прав доступа и/или исключения:

import dsfml.graphics.all;

void main()
{
    auto rect = new Image(1024, 1024);
    rect.dispose();
}

Что я на самом деле должен делать с изображениями и другими подобными классами? Я хотел бы избежать как утечек памяти , так и нарушений прав доступа.


person bfops    schedule 07.02.2011    source источник
comment
На первый взгляд, существует проблема, из-за которой большие блоки данных могут создавать ложные указатели и удерживать мусор на месте. Если Image размещает свои данные в куче и не заставляет их собираться в ближайшее время, а выделение не помечается как отсутствие указателей, то, если их накопится достаточно до того, как сработает сборщик мусора, они могут зайти в тупик.   -  person BCS    schedule 08.02.2011


Ответы (1)


Не могу сейчас посмотреть код, но я думаю, что dispose() на самом деле не предназначен для публичного использования.

Помните, что DSFML — это всего лишь оболочка CSFML, которая, в свою очередь, является оболочкой SFML. Вы должны проявлять большую осторожность, чтобы убедиться, что пользователь ничего не сломает. DSFML подходит для обычного использования, но не может обрабатывать крайние случаи, такие как цикл while (true).

Некоторое время я думал, не лучше ли перейти на подход на основе SWIG, чтобы положить конец этому кошмару обслуживания. Это, вероятно, также упростило бы использование таких расширений, как SFGUI.

person Trass3r    schedule 10.02.2011
comment
Ага, оказывается, единственный реальный способ решить эту и подобные проблемы — увеличить скорость, с которой сборщик мусора собирает память. - person bfops; 11.02.2011