OESharedPtr¶
template<class T>
class OESharedPtr
Warning
This class has been deprecated. Use std::shared_ptr
instead.
C++ only class. This class is not visible in any other languages.
This class is a classic smart pointer used for
automatically managing the dynamic memory allocated for the object
T
. Explicitly calling delete
is generally frowned upon
in modern C++ due to the propensity of explicit delete
leading
to resource leaks and crashes. Deleting memory should be handled
more automatically by mechanisms like
OEOwnedPtr and OESharedPtr.
Hint
One of the most important differences to understand between
OEOwnedPtr and
OESharedPtr is that
OESharedPtr is always usable inside STL
containers like std::vector<OESharedPtr<T> >
.
OEOwnedPtr can only be used inside STL
containers if the compiler supports C++11 move
constructors. Once all common compilers support C++11, the use
of OESharedPtr should be replaced with
OEOwnedPtr in many cases.
OESharedPtr is designed to mimic the standard C++ std::shared_ptr in functionality with some important differences.
The first and most obvious difference is that
OESharedPtr will compile and work in all
compilers OpenEye supports without having to juggle whether it is
coming from the std
or std::tr1
namespaces.
The second key difference between OESharedPtr
and std::shared_ptr is whether
const
is maintained when accessing the object being pointed
to. By default, in order to maintain compatibility with C, C++
allows non-const access to const pointers. By extension, this same
rule applied to C++ smart pointers. This leads to very surprising
behavior like the following:
struct Foo
{
int _x;
void AlterFoo() { _x = 1; }
};
struct BarOwnsFoo
{
Foo *_foo;
void AConstMethod() const { _foo->AlterFoo(); }
};
Even though AConstMethod
is const
, it isn’t actually
logically const. The internals of the class are changing. This
behavior may seem benign at first, but it has vast implications in
a library seeking to be thread-safe. The const
on a method
implies that the method is thread-safe, especially in C++11. In
order to enforce thread-safety at runtime,
OESharedPtr maintains the “const’ness” of its
accessor methods. Therefore, the following is actually a compile
error:
struct Foo
{
int _x;
void AlterFoo() { _x = 1; }
};
struct BarOwnsFoo
{
OESharedPtr<Foo> _foo;
void AConstMethod() const { _foo->AlterFoo(); }
};
Catching thread-safety problems very early, at compilation, is highly desirable for OpenEye. Hence the reason to differ from the standard smart pointer semantics in this way.
Constructors¶
OESharedPtr()
OESharedPtr(T *ptr)
Default constructors the pointer to NULL
. Or constructs a
smart pointer around the pointer ptr
.
operator*¶
T &operator*()
const T &operator*() const
Dereference the smart pointer and return a reference to the held
object while maintaining const
correctness. Note,
dereferencing a NULL
pointer is undefined.
operator->¶
T *operator->()
const T *operator->() const
Access the pointer held by this smart pointer while maintaining
const
correctness.
Get¶
T *Get()
const T *Get() const
Access the pointer held by this smart pointer while maintaining
const
correctness.