观察Naked Pointers(参见第一个回复),问题非常简单:
什么是裸指针?
答案 0 :(得分:13)
这是一个简单的例子:
#include <memory>
struct X { int a,b,c; };
int main()
{
std::shared_ptr<X> sp(new X);
X* np = new X;
delete np;
}
np
是指向X
类型对象的指针 - 如果您已动态分配(new
/ malloc
)此对象,则必须delete
/ free
它......像np
这样的简单指针被称为“裸指针”。
sp
是一个包含指向托管资源的指针的对象,这意味着您可以像使用np
一样使用它,但是当没有shared_ptr
个对象拥有时此资源,资源被释放,因此您不必delete
它。 智能指针负责内存管理,因此您不必;)
答案 1 :(得分:12)
“裸指针”是一个“普通”指针,即标准和C ++上的任何书籍调用指针的东西。这是通常的“T *
”(其中T
是指针指向的类型)。
“赤裸裸”的术语出现反对智能指针,这些指针在许多方面都表现为指针(通常它们会使运算符*
重载,{{1}在某些情况下->
)。
智能指针是“聪明的”,因为它们指定并强制执行一些所有权语义,消除了裸指针的“愚蠢”:事实上,裸指针不指定/知道它们是否拥有对象是指(例如,当指针超出范围时必须解除分配),即使有一些命名约定,也知道某些指针拥有该对象,如果指向该语言,则该语言不会强制执行此操作,因此,如果指针超出范围,没有人手动释放指向的对象(通常在发生异常时会发生这种情况)你有内存泄漏。
相反,智能指针利用C ++类型系统的保证(复制构造函数,赋值运算符,对析构函数的保证调用,......)来建立和实施某种所有权(通常:严格且不可转移,严格但可以转移到另一个智能指针,在几个智能指针之间共享。)...话虽如此,有很多关于StackOverflow和互联网上智能指针的讨论,我很确定你能够找到更多关于智能指针的讨论,以及为什么要使用拥有裸指针的在现代C ++程序中,对象通常是Bad Thing TM 。
答案 2 :(得分:10)
裸指针(原始指针,“哑”指针)是C风格的指针T*
。将此与C ++提供的“智能”指针(std::shared_ptr<T>
,std::weak_ptr<T>
和std::unique_ptr<T>
)进行对比。
答案 3 :(得分:4)
智能指针是C ++中的首选方式,因为它们提供了更好的内存管理。智能指针有额外的信息(计算引用数,当前所有权等)以及它们指向的对象的地址,因此名称智能指针和裸指针不包含这样的额外信息,因此名称裸指针因此他们不再使用后不会删除该对象,因为他们没有信息来执行此操作。 希望它有助于留在我们的脑海里。