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

C++ 如何检查c+中的无效/未初始化对象+;,c++,error-handling,initialization,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_errMes

目前,我创建了一个简单的错误处理系统,通过检查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;
        }
模板内联bool检查(boost::output::expected&obj)
{
如果(obj)
返回true;
其他的
返回false;
}
有了这段代码,如果我理解了如何正确使用output::expected,那么我只需在勘误表中调用上面的函数,一切都应该类似地工作

boost::outcome::expected<ObjectType> obj = functionReturnsObj(); 
ERRASSERT(Check(obj), "Object not initialized!);
boost::output::expected obj=functionReturnsObj();
勘误表(检查(obj),“对象未初始化!”;
我的问题:

是否有更好的方法来检查对象是否被初始化而不必在Booo::结果::预期中包装所有的东西?是否有许多场景,其中对象将不会被初始化,因为C++在创建时自动初始化对象?我应该担心吗?< /P> 是否有更好的方法检查对象是否已初始化

不要

<> P>是否存在许多对象,因为C++在创建时自动初始化对象? 是的,但并不总是这样

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

我应该担心吗

没有

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

不要

<> P>是否存在许多对象,因为C++在创建时自动初始化对象? 是的,但并不总是这样

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

我应该担心吗


不。

除了@BoundaryImposition的答案之外,我只想详细说明一下
我是否应该担心这个问题?

未初始化的C++对象可能会在某些情况下引起问题。如果你有<代码> Foo<代码>,并创建一个实例<代码> f>代码>,那么<代码> f.a < /> >和<代码> f.b>代码>不初始化,不应假定它们是代码> 0 < < /P>

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

除了@BoundaryImposition的答案之外,我只想详细说明一下
我是否应该担心这个问题?

未初始化的C++对象可能会在某些情况下引起问题。如果你有<代码> Foo<代码>,并创建一个实例<代码> f>代码>,那么<代码> f.a < /> >和<代码> f.b>代码>不初始化,不应假定它们是代码> 0 < < /P>

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

嗯,
int thing;
没有初始化…如果你想安全的话,你应该在声明时初始化它们。空指针不是唯一的无效指针。@molbdnilo你是什么意思?@Jason——你可以有一个无效的非空指针。
int*p=new int;delete p;
d之后有效elete
?一个未初始化的指针如何?通常它们不是空的。@PaulMcKenzie啊,是的。谢谢PaulWell
int thing;
没有初始化…如果你想安全的话,你应该在声明时初始化它们。空指针不是唯一的无效指针。@molbdnilo你是什么意思?@Jason——你可以有一个非空指针-无效的空指针。
int*p=new int;delete p;
delete
之后是否有效?未初始化的指针如何?通常它们不是空的。@PaulMcKenzie啊,对了。谢谢Paul