【问题标题】:How to check for invalid/uninitialized object in c++如何在 C++ 中检查无效/未初始化的对象
【发布时间】:2017-11-03 06:11:02
【问题描述】:

目前,我创建了一个简单的错误处理系统,通过检查 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;
        }

有了这段代码,如果我理解如何正确使用结果::预期,那么我只需在我的 ERRASSERT 中调用上述函数,一切都应该类似地工作

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

我的问题:

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

【问题讨论】:

  • 好吧 int thing; 没有初始化...如果你想安全的话,你应该在声明它们时初始化它们。
  • 空指针不是唯一的无效指针。
  • @molbdnilo 你是什么意思?
  • @Jason -- 你可以有一个无效的非 NULL 指针。 int *p = new int; delete p; p 在delete 之后是否有效?未初始化的指针怎么样?通常它们不为空。
  • @PaulMcKenzie 啊,对。谢谢保罗

标签: c++ error-handling initialization


【解决方案1】:

有没有更好的方法来检查一个对象是否被初始化

不要。

如果 C++ 在创建时自动初始化对象,是否有很多情况下对象不会被初始化?

是的,但它不会(总是)。

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

我应该担心这个吗?

没有。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多