因此,我听说现代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;
}
答案 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的“最佳做法”部分。)