在“现代C ++”中作为类成员对象的指针

时间:2011-08-25 18:33:47

标签: c++ raii

因此,我听说现代C ++风格的一个经验法则是,不应该使用new或delete,而应该使用智能指针。所以当我有一个类,其中一个成员是指向另一个对象的指针时,如何去做。通过使用智能指针,我可以避免删除,但我仍然需要用new创建对象。例如。是下面的“规范”现代C ++风格,或者应该怎么做呢?


#include 
#include 

class B {
public:
    B () { std::printf("constructing B\n");}
    ~B () { std::printf("destroying B\n");}
};

class A {
public:
    A () 
    { 
        std::printf("constructing A\n");
        b = std::unique_ptr(new B());
    }
    ~A () { std::printf("destroying A\n");}

private:
    std::unique_ptr b;
};

int main()
{
    A a;
    return 0;
}


1 个答案:

答案 0 :(得分:7)

您使用new。使用new没有任何问题,它应该尽可能少地使用。

(另一方面,delete几乎从不使用,因为它的使用应始终封装在某种RAII句柄中,如智能指针或容器。)< / p>


请注意,使用智能指针时,应始终将new的结果分配给指定的智能指针或使用reset。在您的情况下,您想要使用:

A() : b(new B()) { }

或:

A()
{
    std::unique_ptr<B> x(new B());
    b = std::move(x);
}

或:

A() { b.reset(new B()); }

(为什么这很重要,请参阅boost::shared_ptr documentation的“最佳做法”部分。)