Действительно ли безопасно использовать STL (TR1) shared_ptr между модулями (exes и dlls)

Используйте либо:

plt.tight_layout()

, либо конкретно задайте поля, например. используя subplots_adjust():

subplots_adjust (left = None, bottom = None, right = None, top = None, wspace = None, hspace = None)

blockquote>

Первое решение с вашим примером приводит к:

16
задан Aardvark 8 December 2008 в 14:12
поделиться

4 ответа

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

Другая проблема, которую Вы не упоминали, но которая может быть exascerbated общими указателями, когда код объекта существует в DLL и создается DLL, но другой объект вне DLL заканчивается со ссылкой на него (через общий указатель). Если тот объект уничтожается после того, как DLL разгружен (например, если это будет статичный уровень модуля, или если DLL будет явно разгружен FreeLibrary(), то деструктор общего объекта откажет.

Это может укусить Вас, при попытке записать основанные на DLL, слабо связанные плагины. Это - также причина, что COM позволяет DLLs решить, когда они могут быть разгруженными, вместо того, чтобы позволить серверам COM потребовать - разгружают их.

14
ответ дан 30 November 2019 в 16:42
поделиться

Если Вы заинтересованы, используйте форму shared_ptr конструктора, который берет аргумент средства удаления. Средство удаления может перезвонить в модуль, который выделил объект так, чтобы удаление произошло в надлежащем контексте.

документация Повышения утверждает, что это на 100% совместимо с TR1, так надо надеяться, нет ничего вводящего в заблуждение об этом:

http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/shared_ptr.htm#constructors

7
ответ дан 30 November 2019 в 16:42
поделиться

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

, Который является: должно быть безопасно, если модули пользуются точно той же библиотекой времени выполнения, и точно теми же переключателями компилятора и опциями.

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

2
ответ дан 30 November 2019 в 16:42
поделиться

Лучший совет, который я видел на общем предмете, состоит в том, что память должна быть освобождена в том же контексте, это выделяется. Это не устраняет библиотеку, пасующую назад указатель, который код приложения, как предполагается, освобождает однако, таким образом, я сказал бы, что Вы - вероятно, безопасная передача shared_ptr этим способом, поскольку это - та же общая ситуация.

, Если семантика Вашей системы означает, что указатель на самом деле передается (в смысле владения) от Вашего exe до Вашего dll, тогда auto_ptr мог бы быть лучшим решением. Если, однако, Ваш указатель действительно совместно используется, то shared_ptr является, вероятно, лучшим решением.

2
ответ дан 30 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: