diff --git a/src/coins.cpp b/src/coins.cpp index 91e02331f51..a47ab8063e6 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -43,19 +43,18 @@ size_t CCoinsViewCache::DynamicMemoryUsage() const { } CCoinsMap::iterator CCoinsViewCache::FetchCoin(const COutPoint &outpoint) const { - CCoinsMap::iterator it = cacheCoins.find(outpoint); - if (it != cacheCoins.end()) - return it; - Coin tmp; - if (!base->GetCoin(outpoint, tmp)) - return cacheCoins.end(); - CCoinsMap::iterator ret = cacheCoins.emplace(std::piecewise_construct, std::forward_as_tuple(outpoint), std::forward_as_tuple(std::move(tmp))).first; - if (ret->second.coin.IsSpent()) { - // The parent only has an empty entry for this outpoint; we can consider our - // version as fresh. - ret->second.AddFlags(CCoinsCacheEntry::FRESH, *ret, m_sentinel); + const auto [ret, inserted] = cacheCoins.try_emplace(outpoint); + if (inserted) { + if (!base->GetCoin(outpoint, ret->second.coin)) { + cacheCoins.erase(ret); + return cacheCoins.end(); + } + if (ret->second.coin.IsSpent()) { + // The parent only has an empty entry for this outpoint; we can consider our version as fresh. + ret->second.AddFlags(CCoinsCacheEntry::FRESH, *ret, m_sentinel); + } + cachedCoinsUsage += ret->second.coin.DynamicMemoryUsage(); } - cachedCoinsUsage += ret->second.coin.DynamicMemoryUsage(); return ret; }