如何在c ++中检查无效/未初始化的对象

时间:2017-06-01 23:35:49

标签: c++ error-handling initialization

目前,我已经创建了一个简单的错误处理系统,通过检查nullptr来检查指针是否有效:

        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

然后我可以在我的代码中调用ERRASSERT,如下所示:

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

现在,为了与非指针对象做类似的事情,我有一个Check()函数来查看对象是否已经初始化:

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

使用这段代码,如果我理解如何正确使用outcome :: expected,那么我只需在我的ERRASSERT中调用上面的函数,一切都应该同样工作

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

我的问题:

有没有更好的方法来检查对象是否已初始化而无需将所有内容包装在boost :: outcome :: expected中?是否存在很多场景,如果C ++在创建时自动初始化对象,则不会初始化对象?我甚至应该担心这个吗?

2 个答案:

答案 0 :(得分:5)

  

是否有更好的方法来检查对象是否已初始化

别。

  

是否存在很多场景,如果C ++在创建时自动初始化对象,则无法初始化对象?

是的,它没有(总是)。

但这是程序员的责任(你通常可以依靠编译器警告来捕捉愚蠢的错误)。

  

我是否应该为此担心?

没有

答案 1 :(得分:1)

除了@ BoundaryImposition的回答之外,我只想详细说明Should I even be worried about this?

未初始化的C ++对象可能会在某些情况下导致问题。如果您有Foo并创建如下所示的实例f,则f.af.b未初始化,您不应认为它们是0

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