我继续看到与C++ Primer 5中的“动态记忆”相反的“资源”
默认情况下,用于初始化智能指针的指针必须指向动态内存,因为默认情况下,智能指针使用
delete释放关联对象。我们可以将智能指针绑定到指向的其他类型资源的指针()。然而,要做到这一点,我们必须提供我们自己的操作来代替delete。如果使用智能指针管理资源(
new分配的内存除外),请记住传递删除器。
这里提到的资源是什么?
这是否表明:
与使用new相比,还有其他分配动态内存的方法。(不是所有的动态内存都是通过使用new分配的吗?)
更新:
我不清楚引用的文本的原因是我想错了一些东西,因为我一直在想智能指针只是为了/与动态内存管理有关。因此,该示例使用智能指针来管理非动态内存,这让我感到困惑。
高年级学生的一个很好的解释:
智能指针根本不关心动态内存本身。这只是一种在你需要的时候跟踪它的方法,当它超出你的范围时摧毁它。提到文件句柄、网络连接等,是为了指出它们不是动态内存,但是智能指针可以很好地管理它们。
发布于 2018-07-11 05:52:16
如果使用智能指针管理new分配的内存以外的资源,请记住传递删除器。这里所提到的资源是什么?
资源可以是任何东西。任何可以被要求并需要在之后发布的东西。你(你的教科书)甚至提到一个例子: TCP (或其他)连接。一旦不再需要他们,他们就需要被关闭。
这是否表明: 与使用new相比,还有其他分配动态内存的方法。
不,不是,这意味着智能指针可以管理不是通过new获得的资源,也不能通过delete删除。
(不是所有的动态内存都是通过使用new分配的吗?)
还有其他方法,如malloc,但通常您应该始终在C++中使用C++。
第二,我想问为什么和何时我需要提供我们自己的删除?关键字删除还不够吗?
对于使用new分配的内存,是的。对于其他资源,没有。您不能delete套接字描述符。
您可能需要谷歌术语RAII,它描述了在C++中自动获取和释放资源的概念。
发布于 2018-07-11 06:34:00
想象一下以下情况:
SomeSystemHandle createHandle();
void freeHandle(SomeSystemHandle *);
std::unique_ptr<SomeSystemHandle, void(*)(SomeSystemHandle *)> handle(
createHandle(),
freeHandle
);如您所见,unique_ptr本身并不是在管理内存。它管理着一些手柄,而它却对此漠不关心。这是你的问题中提到的非内存资源的一个例子。
发布于 2018-07-11 12:07:19
具体的有用示例是带有OO设计的C。这里有这样的一个例子:
std::shared_ptr<std::FILE> myfile{std::fopen("myfile.dat","r"),std::fclose};https://stackoverflow.com/questions/51277960
复制相似问题