C++ std::在try-catch块中未捕获唯一的\u ptr取消引用异常

C++ std::在try-catch块中未捕获唯一的\u ptr取消引用异常,c++,c++11,exception-handling,unique-ptr,C++,C++11,Exception Handling,Unique Ptr,让我们假设我有: struct test { bool a; int b; }; int main() { std::unique_ptr<test> ptr; // don't init the ptr try { if (!ptr->a) { std::cout << "ok" << std::endl; } }

让我们假设我有:

struct test {
    bool a;
    int b;
};

int main()
{
    std::unique_ptr<test> ptr;
    // don't init the ptr

    try
    {
        if (!ptr->a)
        {
            std::cout << "ok" << std::endl;
        }
    }
    catch (const std::exception &ex)
    {
        std::cout << "ex: " << ex.what() << std::endl;
    }

    return 1;
}
struct测试{
布尔a;
int b;
};
int main()
{
std::唯一的ptr ptr;
//不要初始化ptr
尝试
{
如果(!ptr->a)
{
标准::cout
那么,是否可以捕获唯一的_ptr de reference异常

没有要捕获的
唯一\u ptr
取消引用异常

作为,

如果
get()==nullptr

您可以轻松地使用这种类似Java的行为编写自己的智能指针,但这确实意味着为每次解引用支付测试和分支费用,这通常看起来很愚蠢

对于注释中描述的稍有不同的问题:

我有一个独特的_ptr列表-我试图通过在其周围放置一个try块来避免单独检查每一个

明智的解决方案可能是只检查一次,而不是每次后续解引用:

if(any_of(begin(ptrs), end(ptrs), logical_not<unique_ptr<test>>{})
{
  throw MyNullPointerException();
}
那么,是否可以捕获唯一的_ptr de reference异常

没有要捕获的
唯一\u ptr
取消引用异常

作为,

如果
get()==nullptr

您可以轻松地使用这种类似Java的行为编写自己的智能指针,但这确实意味着为每次解引用支付测试和分支费用,这通常看起来很愚蠢

对于注释中描述的稍有不同的问题:

我有一个独特的_ptr列表-我试图通过在其周围放置一个try块来避免单独检查每一个

明智的解决方案可能是只检查一次,而不是每次后续解引用:

if(any_of(begin(ptrs), end(ptrs), logical_not<unique_ptr<test>>{})
{
  throw MyNullPointerException();
}

取消引用未初始化的指针是未定义的行为,不会引发异常。@RichardCriten哦……有什么方法可以完成我要做的吗?——我有一个唯一的\u ptr列表——我试图通过在其周围放置一个try块来避免单独检查每个指针……但如果它没有引发异常,我想我必须这样做
if(ptr){…}
围绕每一个指针?为什么你拥有智能指针(
std::unique_ptr
)却什么都没有?这感觉像是一个XY问题。@RichardCritten我使用智能指针,这样我就不必担心垃圾收集等问题了…在我的代码中,当我创建一个新的指针构造函数时(指所指的类型)可能会失败,如果是这样,智能指针实际上是null ptr。所以我想测试这个条件……当正在构造的对象失败时抛出一个异常,并且不创建std::unique_ptr`。取消引用未初始化的指针是未定义的行为,不会抛出异常。@RichardCriten哦……有什么方法可以完成我正在尝试的吗要做什么?-我有一个unique\u ptr的列表-我试图通过在其周围放置一个try块来避免单独检查每个对象…但是如果它没有引发异常,那么我想我必须在每个对象周围执行
if(ptr){…}
?为什么您拥有智能指针(
std::unique\u ptr
)没有任何东西?这感觉像是一个XY问题。@RichardCriten我使用智能指针,这样我就不必太担心垃圾收集之类的问题……在我的代码中,当我创建一个新的指针时,构造函数(指向的类型)可能会失败,如果是这样的话,智能指针实际上是null ptr。因此我想测试这个条件……当正在构造的对象失败时,抛出一个异常,并且不创建std::unique_ptr`。“您可以只向构造函数添加一个检查并抛出包装器”——比如
gsl::not_null
?“您只需向构造函数添加一个检查并抛出包装器”—比如
gsl::not_null