依靠布尔值来访问指针

Pil*_*pel 3 c++ pointers

我有一个名为MyClass包含指向对象的指针的类,如下所示:

class MyClass {
public:
    MyClass() : _blob(nullptr) {}
    ~MyClass() { free(); }

    void generate() {
        if(!_blob)
            _blob = new Blob;
    }

    void free() {
        if(_blob) {
            delete _blob;
            _blob = nullptr;
        }
    }

    Blob* getBlob() { return _blob; }

private:
    Blob *_blob;
};
Run Code Online (Sandbox Code Playgroud)

它保存指向堆分配对象的指针并且不在堆栈中包含它的原因是因为某些MyClass实例不为此对象分配数据,因此在访问它之前我需要检查它是否不是空指针:

if(myClass->getBlob())
    myClass->getBlob()->doSomething();
Run Code Online (Sandbox Code Playgroud)

现在我有了这个想法来存储一个被调用的bool变量_hasBlob,然后像这样使用它

if(myClass->hasBlob())
    myClass->getBlob()->doSomething();
Run Code Online (Sandbox Code Playgroud)

这被认为是更快和合法吗?或者它被认为是不好的做法,因为我可以看到以某种方式结束取消引用nullptr的潜在危险.

eer*_*ika 7

这是合法但多余的.它并不快.事实上,虽然检查本身一样快,但保持与指针有效性同步的布尔值略微慢一些.关于它的最糟糕的事情是证明布尔值总是同步的维护负担.一旦它被实现并证明是正确的,它只是多余的并浪费内存.