观察Naked Pointers(见第一个回复),问题很简单:什么是裸指针?
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它。)
np
X
new
malloc
delete
free
sp
shared_ptr
sauutmhj2#
“裸指针”是一个“普通”指针,即标准和C上的任何书籍都称之为指针。它通常是“T *”(其中T是指针指向的类型)。“裸”术语将它们与 * 智能 * 指针相对立,智能指针是在许多方面表现为指针的类(通常它们重载运算符*,->,在某些情况下[])。智能指针是“智能的”,因为它们指定并强制执行一些所有权语义,消除了裸指针的“愚蠢”:事实上,裸指针并不指定/知道它们是否拥有它们所引用的对象(例如,如果指针超出作用域时必须释放它),并且,即使使用一些命名约定,已知某个指针拥有如果指向的对象,语言也不会强制执行这一点,所以,如果一个指针超出了作用域,并且没有人手动释放所指向的对象(通常情况下,如果引发异常,就会发生这种情况),则会发生内存泄漏。相反,智能指针利用C类型系统的保证(复制构造函数,赋值运算符,对析构函数的保证调用,...)来建立和实施某种所有权(通常是:严格和不可转移、严格但可转移到另一个智能指针、在几个智能指针之间共享)。...话虽如此,在StackOverflow和互联网上有大量关于智能指针的讨论,我很确定你能找到关于智能指针的更广泛的讨论,以及为什么在现代C++程序中使用拥有对象的裸指针通常是坏事。
T *
T
*
->
[]
ryevplcw3#
裸指针(原始指针,“哑”指针)是C风格的指针T*。与C++提供的“智能”指针(std::shared_ptr<T>,std::weak_ptr<T>和std::unique_ptr<T>)相比。
T*
std::shared_ptr<T>
std::weak_ptr<T>
std::unique_ptr<T>
svmlkihl4#
智能指针是C++中的首选指针,因为它们提供了更好的内存管理。它们有额外的信息(计算引用的数量,当前所有权等)沿着它们指向的对象的地址。然而,裸指针不包含这些额外的信息,因此不能在不再使用后删除它们所指向的对象。
4条答案
按热度按时间qnakjoqk1#
下面是一个简单的例子:
np
是指向X
类型的对象的指针-如果你动态分配了(new
/malloc
)这个对象,你必须delete
/free
它...像np
这样的简单指针被称为**“裸指针”**。sp
是一个对象,它持有一个指向托管资源的指针,这意味着你可以像使用np
一样使用它,但是当没有shared_ptr
对象拥有这个资源时,资源被释放,所以你不必delete
它。)sauutmhj2#
“裸指针”是一个“普通”指针,即标准和C上的任何书籍都称之为指针。它通常是“
T *
”(其中T
是指针指向的类型)。“裸”术语将它们与 * 智能 * 指针相对立,智能指针是在许多方面表现为指针的类(通常它们重载运算符
*
,->
,在某些情况下[]
)。智能指针是“智能的”,因为它们指定并强制执行一些所有权语义,消除了裸指针的“愚蠢”:事实上,裸指针并不指定/知道它们是否拥有它们所引用的对象(例如,如果指针超出作用域时必须释放它),并且,即使使用一些命名约定,已知某个指针拥有如果指向的对象,语言也不会强制执行这一点,所以,如果一个指针超出了作用域,并且没有人手动释放所指向的对象(通常情况下,如果引发异常,就会发生这种情况),则会发生内存泄漏。
相反,智能指针利用C类型系统的保证(复制构造函数,赋值运算符,对析构函数的保证调用,...)来建立和实施某种所有权(通常是:严格和不可转移、严格但可转移到另一个智能指针、在几个智能指针之间共享)。
...话虽如此,在StackOverflow和互联网上有大量关于智能指针的讨论,我很确定你能找到关于智能指针的更广泛的讨论,以及为什么在现代C++程序中使用拥有对象的裸指针通常是坏事。
ryevplcw3#
裸指针(原始指针,“哑”指针)是C风格的指针
T*
。与C++提供的“智能”指针(std::shared_ptr<T>
,std::weak_ptr<T>
和std::unique_ptr<T>
)相比。svmlkihl4#
智能指针是C++中的首选指针,因为它们提供了更好的内存管理。它们有额外的信息(计算引用的数量,当前所有权等)沿着它们指向的对象的地址。然而,裸指针不包含这些额外的信息,因此不能在不再使用后删除它们所指向的对象。