More information is:
When I return an sk_sp<SkShader> object, It enters the skia internal logic
1. return sk_sp<SkShader>
2. sk_sp<T>& operator=(sk_sp<T>&& that) {
this->reset(that.release());
return *this;
}
3. void reset(T* ptr = nullptr) {
T* oldPtr = fPtr;
fPtr = ptr;
SkSafeUnref(oldPtr);
}
4. template <typename T> static inline void SkSafeUnref(T* obj) {
if (obj) {
obj->unref();
}
}
5. void unref() const {
if (1 == fRefCnt.fetch_add(-1, std::memory_order_acq_rel)) {
this->internal_dispose();
}
}
6. Unfortunately crash...