哪些资源是由智能指针管理的,而它们的内存不是由new分配的



我继续看到"资源"与C++Primer 5th中的"动态内存"相反:

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


如果您使用智能指针来管理除内存之外的资源new分配,记得传递一个deleter。

这里提到的资源是什么?

它是否表明:

与使用new相比,还有其他分配动态内存的方式。(不是所有的动态内存都是用new分配的吗?(


更新:

我之所以不清楚引用的文本,是因为我想错了一些事情,也就是说我一直认为智能指针只是为动态内存管理而发明的。所以这个例子使用智能指针来管理非动态内存,这让我很困惑。

一位资深人士给出了一个很好的解释:

智能指针根本不关心动态的东西内存本身。这只是一种在你需要它,并在它超出范围时销毁它。这个提到文件句柄、网络连接等,是为了指出它们不是动态内存,但智能指针可以不管怎样,管理它们都很好。

如果使用智能指针管理内存以外的资源由new分配,记得传递deleter。

这里提到的资源是什么?

资源可以是任何东西。任何可以获取并需要在之后释放的东西。你(你的课本(甚至提到了一个例子:TCP(或其他(连接。一旦不再需要它们,就需要关闭它们。

这是否表明:

与使用new。

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

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

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

其次,我想问一下为什么以及何时需要提供我们自己的deleter?删除关键字还不够吗?

对于使用new分配的内存,是。对于其他资源,不可以。您不能delete套接字描述符。


您可能想在谷歌上搜索术语RAII,它描述了在C++中自动获取和释放资源的概念。

想象一下以下情况:

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

正如您所看到的,unique_ptr本身并不是在管理内存。它管理一些句柄,而它对此一无所知。这是你的问题中提到的非内存资源的一个例子。

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

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

最新更新