c++ 什么是裸指针?

cwxwcias  于 2023-04-08  发布在  其他
关注(0)|答案(4)|浏览(641)

观察Naked Pointers(见第一个回复),问题很简单:
什么是裸指针?

qnakjoqk

qnakjoqk1#

下面是一个简单的例子:

#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它。)

sauutmhj

sauutmhj2#

“裸指针”是一个“普通”指针,即标准和C上的任何书籍都称之为指针。它通常是“T *”(其中T是指针指向的类型)。
“裸”术语将它们与 * 智能 * 指针相对立,智能指针是在许多方面表现为指针的类(通常它们重载运算符*->,在某些情况下[])。
智能指针是“智能的”,因为它们指定并强制执行一些所有权语义,消除了裸指针的“愚蠢”:事实上,裸指针并不指定/知道它们是否拥有它们所引用的对象(例如,如果指针超出作用域时必须释放它),并且,即使使用一些命名约定,已知某个指针拥有如果指向的对象,语言也不会强制执行这一点,所以,如果一个指针超出了作用域,并且没有人手动释放所指向的对象(通常情况下,如果引发异常,就会发生这种情况),则会发生内存泄漏。
相反,智能指针利用C
类型系统的保证(复制构造函数,赋值运算符,对析构函数的保证调用,...)来建立和实施某种所有权(通常是:严格和不可转移、严格但可转移到另一个智能指针、在几个智能指针之间共享)。
...话虽如此,在StackOverflow和互联网上有大量关于智能指针的讨论,我很确定你能找到关于智能指针的更广泛的讨论,以及为什么在现代C++程序中使用拥有对象的裸指针通常是坏事。

ryevplcw

ryevplcw3#

裸指针(原始指针,“哑”指针)是C风格的指针T*。与C++提供的“智能”指针(std::shared_ptr<T>std::weak_ptr<T>std::unique_ptr<T>)相比。

svmlkihl

svmlkihl4#

智能指针是C++中的首选指针,因为它们提供了更好的内存管理。它们有额外的信息(计算引用的数量,当前所有权等)沿着它们指向的对象的地址。然而,裸指针不包含这些额外的信息,因此不能在不再使用后删除它们所指向的对象。

相关问题