什么是裸指针?

Liv*_*ing 13 c++ pointers terminology

观察Naked Pointers(参见第一个回复),问题非常简单:

什么是裸指针?

Lih*_*ihO 13

这是一个简单的例子:

#include <memory>

struct X { int a,b,c; };

int main()
{
    std::shared_ptr<X> sp(new X);
    X* np = new X;
    delete np;
}
Run Code Online (Sandbox Code Playgroud)

np是指向类型对象的指针X- 如果你已动态分配(new/ malloc)这个对象,你必须delete/ free它......简单的指针就像np被称为"裸指针".

sp是一个包含指向托管资源的指针的对象,这意味着您可以像使用它一样使用它np,但是当没有shared_ptr拥有此资源的对象时,资源将被释放,因此您不必使用delete它.智能指针负责内存管理,因此您不必;)


Mat*_*lia 12

"裸指针"是一个"普通"指针,即标准和C++上的任何书籍调用指针.这是通常的" T *"(T指针指向的类型).

"赤裸裸"的术语开始反对他们使用智能指针,智能指针是在许多方面表现为指针的类(通常它们会使运算符超载*,->在某些情况下[]).

智能指针是"智能"的,因为它们指定并强制执行一些所有权语义,消除了裸指针的"愚蠢":事实上,裸指针不指定/知道它们是否拥有它们所指的对象(例如,如果它必须被释放当指针超出范围时),即使有一些命名约定,已知某些指针拥有该对象,如果指向,该语言不会强制执行此操作,因此,如果指针超出范围而没有人手动释放指向对象(通常在发生异常时会发生这种情况)您有内存泄漏.

相反,智能指针利用C++类型系统的保证(复制构造函数,赋值运算符,对析构函数的保证调用,......)来建立和实施某种所有权(通常:严格且不可转移,严格但可以转移)到另一个智能指针,在几个智能指针之间共享).

...话虽如此,有很多关于StackOverflow和互联网上智能指针的讨论,我很确定你能够找到更多关于智能指针的讨论,以及为什么使用拥有对象的裸指针通常现代C++程序中的Bad Thing TM.


fre*_*low 10

裸指针(原始指针,"哑"指针)是C风格的指针T*.将此与C++提供的"智能"指针(std::shared_ptr<T>,std::weak_ptr<T>std::unique_ptr<T>)进行对比.