103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright (c) 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/ref_counted.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct Foo : public base::RefCounted<Foo> { 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int dummy; 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class Bar { 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Foo* TestFunction(); 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_refptr<Foo> CreateFoo(); 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// An example of an unsafe conversion--the scoped_refptr will be destroyed by 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// the time function returns, since it's a temporary, so the returned raw 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// pointer may point to a deleted object. 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)Foo* Bar::TestFunction() { 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return CreateFoo(); 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 23