如何检查C ++智能指针内存分配是否成功?

时间:2018-06-20 11:30:53

标签: c++ c++11 new-operator smart-pointers unique-ptr

请考虑智能指针std::unique_ptr的以下用法:

std::unique_ptr<char> sp(new(std::nothrow) char[sz]);

如何检查new是否成功?

我有两个选择:

  1. 方法1-检查bool值:if(!sp){}
  2. 方法2-与空指针比较:if(sp==nullptr){}

示例(source

#include <iostream>
#include <memory>
using namespace std;

int main() {
    constexpr long long sz = 1000000e10;

    //raw pointer
    auto ptr = new(std::nothrow) char[sz];
    if(ptr==nullptr)
    {
        cout<<"ptr nullptr"<<endl;
    }

    //smart pointer
    std::unique_ptr<char> sp(new(std::nothrow) char[sz]);

    if(!sp)
    {
        cout<<"sp nullptr bool"<<endl;
    }

    if(sp==nullptr)
    {
        cout<<"sp nullptr =="<<endl;
    }
    return 0;

}

输出:

Success #stdin #stdout 0s 4396KB
ptr nullptr
sp nullptr bool
sp nullptr ==

方法1和方法2似乎都可以使用。

但是,我想从权威来源(C ++标准,msdn,gcc文档)中读取这确实是正确的方法。

1 个答案:

答案 0 :(得分:3)

作为权威人士,我可以确认两种方法确实正确。

开个玩笑:std::unique_ptr的{​​{3}}和operator ==(std::nullptr_t)重载以执行指针期望的操作,所以是的,尽管方法1更惯用,但两者都是正确的