什么是裸指针?

时间:2012-02-15 18:57:43

标签: c++ pointers terminology

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

什么是裸指针?

4 个答案:

答案 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 ++中的首选方式,因为它们提供了更好的内存管理。智能指针有额外的信息(计算引用数,当前所有权等)以及它们指向的对象的地址,因此名称智能指针和裸指针不包含这样的额外信息,因此名称裸指针因此他们不再使用后不会删除该对象,因为他们没有信息来执行此操作。 希望它有助于留在我们的脑海里。