智能指针管理的资源有哪些,而内存不是由新指针分配的?

时间:2018-07-11 05:42:06

标签: c++

C ++ Primer 5th 的“动态内存”相反,我继续看到“资源”:

  

默认情况下,用于初始化智能指针的指针必须指向   动态内存,因为默认情况下,智能指针使用delete来释放   关联的对象。我们可以将智能指针绑定到其他指针   各种资源。但是,这样做,我们必须提供自己的   代替delete使用的操作。


  

如果您使用智能指针来管理除内存以外的资源   由new分配,请记住传递一个删除器。

这里提到的资源是什么?

这是否表明:

与使用new相比,还有其他分配动态内存的方法。 (不是所有的动态内存本质上都是通过使用new来分配的吗?)


更新:

之所以我对引用的文字不清楚,是因为我对某些事情有误,这是因为我一直认为智能指针仅是为动态内存管理而发明的。因此,该示例使用智能指针来管理非动态内存,这让我感到困惑。

上司的一个很好的解释:

  

智能指针根本不关心动态的事物   这样的记忆。这只是在您跟踪某事的一种方式   需要它,并在超出范围时销毁它。的   提到文件句柄,网络连接等的重点是   指出它们不是动态内存,但是智能指针可以   无论如何都可以管理它们。

3 个答案:

答案 0 :(得分:5)

  
    

如果您使用智能指针来管理内存以外的资源     由new分配,请记住传递一个删除器。

  
     

这里提到的资源是什么?

资源可以是任何东西。可以获取的任何东西,之后都需要释放。您(您的教科书)甚至提到了一个示例:TCP(或其他)连接。一旦不再需要它们,则需要将其关闭。

  

这是否表明:

     

与以下方法相比,还有其他方法可以分配动态内存   使用新的。

不是,这意味着智能指针可以管理不是通过new获取并且不能通过delete删除的资源。

  

(不是所有动态内存本质上都是通过使用new分配的吗?)

还有其他类似malloc的方法,但是通常您应该在C ++中始终使用new

  

第二,我想问为什么和何时需要提供我们自己的   删除器?关键字删除还不够吗?

对于用new分配的内存,可以。对于其他资源,没有。您无法delete使用套接字描述符。


您可能想用Google RAII这个词来描述这种用C ++自动获取和释放资源的概念。

答案 1 :(得分:1)

想象一下以下情况:

SomeSystemHandle createHandle();
void freeHandle(SomeSystemHandle *);

std::unique_ptr<SomeSystemHandle, void(*)(SomeSystemHandle *)> handle(
    createHandle(), 
    freeHandle
);

您可以看到unique_ptr本身并不是在管理内存。它管理一些句柄,它是关于它遗忘的。这是您的问题中提到的非内存资源的示例。

答案 2 :(得分:0)

具体有用的示例是带有OO设计的C API。一个这样的:

std::shared_ptr<std::FILE> myfile{std::fopen("myfile.dat","r"),std::fclose};