与 C ++ Primer 5th 的“动态内存”相反,我继续看到“资源”:
默认情况下,用于初始化智能指针的指针必须指向 动态内存,因为默认情况下,智能指针使用
delete
来释放 关联的对象。我们可以将智能指针绑定到其他指针 各种资源。但是,这样做,我们必须提供自己的 代替delete
使用的操作。
如果您使用智能指针来管理除内存以外的资源 由
new
分配,请记住传递一个删除器。
这里提到的资源是什么?
这是否表明:
与使用new
相比,还有其他分配动态内存的方法。 (不是所有的动态内存本质上都是通过使用new
来分配的吗?)
之所以我对引用的文字不清楚,是因为我对某些事情有误,这是因为我一直认为智能指针仅是为动态内存管理而发明的。因此,该示例使用智能指针来管理非动态内存,这让我感到困惑。
上司的一个很好的解释:
智能指针根本不关心动态的事物 这样的记忆。这只是在您跟踪某事的一种方式 需要它,并在超出范围时销毁它。的 提到文件句柄,网络连接等的重点是 指出它们不是动态内存,但是智能指针可以 无论如何都可以管理它们。
答案 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};