首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是由智能指针管理的资源,而它们的内存不是由新分配的?

什么是由智能指针管理的资源,而它们的内存不是由新分配的?
EN

Stack Overflow用户
提问于 2018-07-11 05:42:06
回答 3查看 254关注 0票数 4

我继续看到与C++ Primer 5中的“动态记忆”相反的“资源”

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

如果使用智能指针管理资源( new分配的内存除外),请记住传递删除器。

这里提到的资源是什么?

这是否表明:

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

更新:

我不清楚引用的文本的原因是我想错了一些东西,因为我一直在想智能指针只是为了/与动态内存管理有关。因此,该示例使用智能指针来管理非动态内存,这让我感到困惑。

高年级学生的一个很好的解释:

智能指针根本不关心动态内存本身。这只是一种在你需要的时候跟踪它的方法,当它超出你的范围时摧毁它。提到文件句柄、网络连接等,是为了指出它们不是动态内存,但是智能指针可以很好地管理它们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-11 05:52:16

如果使用智能指针管理new分配的内存以外的资源,请记住传递删除器。这里所提到的资源是什么?

资源可以是任何东西。任何可以被要求并需要在之后发布的东西。你(你的教科书)甚至提到一个例子: TCP (或其他)连接。一旦不再需要他们,他们就需要被关闭。

这是否表明: 与使用new相比,还有其他分配动态内存的方法。

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

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

还有其他方法,如malloc,但通常您应该始终在C++中使用C++。

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2018-07-11 06:34:00

想象一下以下情况:

代码语言:javascript
复制
SomeSystemHandle createHandle();
void freeHandle(SomeSystemHandle *);

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

如您所见,unique_ptr本身并不是在管理内存。它管理着一些手柄,而它却对此漠不关心。这是你的问题中提到的非内存资源的一个例子。

票数 1
EN

Stack Overflow用户

发布于 2018-07-11 12:07:19

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

代码语言:javascript
复制
std::shared_ptr<std::FILE> myfile{std::fopen("myfile.dat","r"),std::fclose};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51277960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档