Jason
Jason

Reputation: 2298

How to check for invalid/uninitialized object in c++

Currently, I've created a simple error handling system to check whether a pointer is valid by checking for nullptr like so:

        inline void ErrReport(const char8* fileOfError, int32 lineNumberOfError, const Blz::string c_errMessage)
        {
            ErrorContext::LogContext();
            LOG("  ERROR: %s\n", c_errMessage.c_str());
            LOG("  In %s: %i\n\n", fileOfError, lineNumberOfError);
            exit(0);
        }

        #if(_DEBUG)
            #define ERRASSERT(test, msg) do {if (!(test)) Blz::Err::ErrReport(__FILE__, __LINE__, msg);} while (0)
        #endif

I can then call ERRASSERT in my code like so:

unsgined char* imageData = LoadImage("PathToImage");
ERRASSERT(imageData, "Image did not load properly");

Right now, in order to do something similar with non-pointer objects I have a Check() function to see if an object has been initialized or not:

        template<typename T> inline bool Check(boost::outcome::expected<T>& obj)
        {
            if (obj)
                return true;
            else
                return false;
        }

With this code, if I understand how to use outcome::expected correctly, I would then just call the above function within my ERRASSERT and everything should work similiarly

boost::outcome::expected<ObjectType> obj = functionReturnsObj(); 
ERRASSERT(Check(obj), "Object not initialized!);

My question:

Is there a better way to check if an object is initialized without having to wrap everything in boost::outcome::expected? Are there even many scenarios where an object wouldn't be initialized given C++ automatically initializes objects upon creation? Should I even be worried about this?

Upvotes: 1

Views: 1342

Answers (2)

volatilevar
volatilevar

Reputation: 1676

I just want to elaborate a bit on Should I even be worried about this? in addition to @BoundaryImposition's answer.

An uninitialized C++ object may cause you issues in certain cases. If you have Foo and create an instance f as below, then f.a and f.b are not initialized and you should not assume they are 0.

struct Foo { int a; int b; };
Foo f;

Upvotes: 1

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385264

Is there a better way to check if an object is initialized

Don't.

Are there even many scenarios where an object wouldn't be initialized given C++ automatically initializes objects upon creation?

Yes, and it doesn't (always).

But that's the programmer's responsibility (and you can usually rely on compiler warnings to catch silly mistakes).

Should I even be worried about this?

No.

Upvotes: 6

Related Questions