LINUX.ORG.RU

История изменений

Исправление DawnCaster, (текущая версия) :

Я не в курсе что там у QT в кишках, очень давно уже в нём не работал.

Но общая ситуация тут такая получается - мы в нашем коде пытаемся юзать умные указатели из std::, а внешний код может работать только с обычными. И тогда мы ему передаём обычный указатель на память в куче, который с нашей стороны обёрнут умным указателем.

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

Может QT со своим постпроцессором MOC что-то с этим делает, может особым образом объявленные умные указатели или другие объекты в каких-то местах в классах QT как-то особым образом обрабатываюся, я хз. Я говорил про общий случай, я не в курсе даже что там делает connect у QT. Но полагаться на внешнюю логику в таких случаях не рекомендуется обычно.

Исправление DawnCaster, :

Я не в курсе что там у QT в кишках, очень давно уже в нём не работал.

Но общая ситуация тут такая получается - мы в нашем коде пытаемся юзать умные указатели из std::, а внешний код может работать только с обычными. И тогда мы ему передаём обычный указатель на память в куче, который с нашей стороны обёрнут умным указателем.

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

Может QT со своим постпроцессором MOC что-то с этим делает, может как-то особым образом объявленные умные указатели в каких-то местах в классах QT как-то правильно разруливают проблему. Я говорил про общий случай, я не в курсе даже что там делает connect у QT.

Исходная версия DawnCaster, :

Я не в курсе что там у QT в кишках, очень давно уже в нём не работал.

Но общая ситуация тут такая получается - мы в нашем коде пытаемся юзать умные указатели из std::, а внешний код может работать только с обычными. И тогда мы ему передаём обычный указатель на память в куче, который с нашей стороны обёрнут умным указателем.

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