关于c ++:既然存在智能指针,那么使用C类型指针的方式是否已弃用?

Now that smart pointers exist, is it deprecated style to use C type pointers?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Which kind of pointer do I use when?

有很多优点支持C++ 11的智能指针:它们更安全,它们的功能和范围更为隐蔽。

是"经典"C型指针吗?

1
2
3
class C{};
C c;
C* c_p = &c;

现在过时了吗?他们甚至被否决了吗?或者是否存在C指针仍然有意义的用例?

编辑:带有智能指针的代码段:

1
2
3
class C{};
C c;
std::shared_ptr<C> c_p(new C());

编辑:感谢您指出副本。从Xeo的回答来看:

Use dumb pointers (raw pointers) or references for non-owning references to resources and when >you know that the resource will outlive the referencing object / scope. Prefer references and >use raw pointers when you need either nullability or resettability.

如果只有这些,我接受这个问题已经解决了。


有一些原始指针有意义的用例。

现代代码中的原始指针是"非拥有"指针。这意味着代码不应该做任何需要或取得指向对象所有权的事情。例如,它不应该是deleted,用于构造拥有的智能指针,或者保存在当前上下文之外。


绝对不是。智能指针用于特殊情况,而不是用于一般用途。根据应用程序和编程风格,大多数指针仍然是原始指针;在某些情况下,实际上一点也不聪明。


不,原始指针没有过时。除非必要,否则通常不鼓励使用它们。更不鼓励通过原始指针维护对象的所有权,因为您必须记住delete,这在出现异常时可能很难做到。

原始指针比智能指针更有效,因此在代码的某些性能敏感的部分使用它们是有意义的。在一些领域,比如线性代数中,指针算法是有用的,您可以在那里使用原始指针[1],或者在原始指针之上构建新的抽象,可能与智能指针结合使用,而不是只使用智能指针。

[1]例如,用于定义子矩阵的视图