【发布时间】: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