2015-09-16 5 views
0

Я немного неясен, как именно эти объекты функционируют, образуя мосты между программным обеспечением и оборудованием. Являются ли они в значительной степени просто объектами программного обеспечения, которые уничтожаются, если вы просачиваете их в кучу, когда вы завершаете процесс? Или есть что-то еще?Что происходит, когда вы протекаете «устройство» и «контекст устройства» - в частности, d3d?

Причина, по которой я спрашиваю, я забыл, что моя инициализационная процедура изменила его statemachine и, следовательно, включила процедуры, в результате чего она создала как можно больше «DeviceContexts» и «Devices» и переназначала их тем же указателям (через d3d11createdevice), прежде чем я поймал, что моя память протекает около 2 ГБ.

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

I холодный сброс моего компьютера независимо от того, чтобы быть уверенным. Но было бы хорошо знать, что происходит, когда вы используете интерфейсы низкого уровня, подобные этому, и вы не можете их правильно уничтожить/освободить.

+0

Операционная система очищает все эти контексты устройства, когда ваша программа завершается. В противном случае неудачная программа может привести к остановке системы. – 1201ProgramAlarm

+0

Так что мне действительно не нужно беспокоиться о причинении вреда аппарату каким-либо образом этим? Я знаю, что это может показаться глупым вопросом, но я действительно не понимаю драйверов устройств. – ThisHandleNotInUse

+0

Вы не сможете повредить аппаратное обеспечение, используя их, и вам не нужно беспокоиться об этом. – 1201ProgramAlarm

ответ

1

Операционная система очищает все эти контексты устройства, когда ваша программа завершается. В противном случае неудачная программа может привести к остановке системы.

Ваша другая проблема (выраженная в комментарии) о повреждении аппаратного обеспечения также невозможна. Если бы это была вредоносная программа, она могла бы повредить всевозможные хаосы. Возможно, вам удастся нанести вред аппаратным средствам, напрямую обратившись к нему, но этот вид доступа - это то, что для драйвера (и контекста устройства, который находится между вашей программой и драйвером).

+0

Основная проблема с «утечками» COM-объектов заключается в том, что если у вас много утечек, которые не имеют значения, действительно очень сложно найти утечку, которая имеет значение. Как правило, хорошей практикой является чистое существование как памяти, так и COM-объектов, поскольку это позволяет найти плохие утечки, если они возникнут. Тем не менее, это не повредит системе ... просто приложение, о котором идет речь. –

+0

Для объектов COM использование интеллектуального указателя C++, такого как '' Microsoft :: WRL :: ComPtr'', является хорошим способом автоматической очистки объектов Direct3D. –

+0

@ChuckWalbourn Да, я не игнорирую утечки - это была просто ошибка, когда я пропустил вставку точки выхода в цикл инициализации, что привело к созданию как 2 ГБ просочившихся устройств и контекстов. Я не был уверен, действительно ли это было опасно после того, как сам процесс был прерван, - если возможно, были связаны с GPU, которые не собирались выпускаться, потому что я никогда не говорил, чтобы GPU выпустил их или что-то в этом роде. – ThisHandleNotInUse