问题标签 [ownership]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
436 浏览

c++ - 如何处理指针成员的不同所有权策略?

考虑以下类结构:

我在库中公开这个类,所以我无法控制它的使用方式。

我目前有一些关于持有指针的Filter对象所有权的设计问题。FilterChain更具体地说,这里有两种可能的使用场景FilterChain

  • 场景 A:我的库中的一些函数正在构建一个(可能很复杂)过滤器链,根据需要分配内存,并返回一个新分配的FilterChain对象。例如,其中一个函数从一个文件构造一个过滤器链,它可以描述任意复杂的过滤器(包括过滤器链的过滤器链等)。一旦工作完成,函数的用户负责对象销毁。
  • 场景 B:用户可以访问一堆Filter对象,并希望以特定方式将它们组合到过滤器链中。用户构造FilterChain对象供自己使用,然后在完成后销毁它们。当引用它们的对象被销毁时,这些Filter对象不能被销毁。FilterChain

现在,管理对象所有权的两种最简单的方法FilterChain是:

  • FilterChain拥有Filter对象。这意味着 所引用的对象FilterChainFilterChain的析构函数中被销毁。这与场景 B 不兼容。
  • FilterChain拥有这些Filter对象。这意味着FilterChain' 的析构函数什么都不做。现在方案 A 存在一个问题,因为用户必须知道所有Filter涉及的对象的内部结构才能在不遗漏任何一个的情况下将它们全部销毁,因为父对象FilterChain本身不会这样做。那只是糟糕的设计,并要求内存泄漏。

因此,我需要一些更复杂的东西。我的第一个猜测是设计一个带有可设置布尔标志的智能指针,指示智能指针是否拥有该对象。然后,不是采用指向Filter对象的指针集合,而是采用指向对象FilterChain的智能指针Filter集合。当FilterChain' 的析构函数被调用时,它会破坏智能指针。当且仅当设置了指示所有权的布尔标志时,智能指针本身的析构函数将销毁指向的对象(Filter对象) 。

我觉得这个问题在 C++ 中很常见,但是我在网上搜索流行的解决方案或聪明的设计模式并不是很成功。确实,auto_ptr在这里并没有真正的帮助,而且shared_ptr似乎有点矫枉过正。那么,我的解决方案是个好主意吗?

0 投票
1 回答
720 浏览

c# - 当 SD 不能(还)被访问时在 C# 中设置文件/目录所有者

温柔,

以下情况。网络共享中的某些文件甚至管理员都没有权限,权限仅为两个单独的用户设置。在检测和修复此类问题的操作过程中(因为不希望这样做),我需要添加对管理员的访问权限。

在 Windows 资源管理器中,这很容易。由于我是管理员,我可以获取文件或文件夹的所有权,然后编辑安全描述符。

问题是,使用 FileSecurity.GetAccessControl() [或者更确切地说是 FileSecurity.GetAccessControl(AccessControlSections.Owner)] 不起作用,我收到 UnauthorizedAccessException。

但是我 - 需要 - 能够做到这一点,有人有小费吗?P/Invoke 可能是这里的解决方案,如果是这样,我将如何做到这一点?

我对这件事感到困惑,因为我认为它应该可以工作,因为它确实在资源管理器中工作......

谢谢炸弹!- 克里斯

0 投票
2 回答
513 浏览

php - PHP - 在运行时更改进程的所有权

我有一个 PHP 脚本,我需要从命令行以 root 身份运行。

在脚本完成一些关键操作(需要 root 访问权限)后,我想将进程的所有者更改为“nobody”。

用PHP可以吗?我该怎么做?

0 投票
1 回答
789 浏览

c++ - unique_ptrs 的侵入性列表?

我有一个高度多线程的程序,它包含一个侵入性的对象链接列表。我需要将此列表中的对象传递给多个线程,但一次只有 1 个线程拥有该对象,这意味着我不需要共享该对象或指向它的指针。

我想使用 boost 创建一个带有 unique_ptr 的侵入性列表,但从我读过的内容来看,unique_ptr 与 Boost 侵入式库不兼容,因为它没有正确的所有权语义。

根据这个,侵入式库要求它的元素(指针)具有与原始指针相同的所有权语义。所以 unique_ptr 甚至 shared_ptr 都不符合条件。

我想知道是否有人可以就如何最好地实现我的侵入式列表给我一些建议,以便我可以安全地通过多个线程传递它的元素并知道它们被移动到该线程而不是在线程之间共享?

0 投票
3 回答
1897 浏览

c++ - C ++:对shared_ptr容器的访问应该返回原始或共享ptr?

如果我使用 shared_ptrs 的容器并明确允许访问其元素,如果我打算将容器作为负责“清理”的容器,我应该返回 shared_ptrs 还是原始指针?

在这种情况下是否有理由返回 shared_ptrs,或者原始指针可以吗?

问候!

0 投票
3 回答
1976 浏览

c++ - 手动对象所有权与智能指针

现在,我的 C++ 项目中的对象所有权/删除是手动跟踪的(主要通过注释)。几乎每个堆分配的对象都是使用各种工厂创建的

例如

在这种情况下,智能指针会提供什么好处(如果有的话)?

0 投票
1 回答
947 浏览

c++ - 返回 C++ 多态对象(接口)

我想知道现在从函数返回指向多态对象的指针时被认为是最佳实践,例如在使用工厂时。如果我转让所有权,我应该归还boost::unique_ptr<Interface>吗?如果我不转让所有权(例如返回对成员的引用),我应该返回什么?是否有另一种常用的非基于提升的方法?谢谢。

编辑:它应该与 C++03 兼容,可以轻松升级到 0x

EDIT2:请注意,我明确询问常见方法、最佳实践,而不仅仅是“一种方法”。暗示将来对代码库进行条件搜索和替换的解决方案看起来不是一个好习惯,不是吗?

EDIT3:关于 auto_ptr 的另一点是它已被弃用,无论它多么整洁,所以在接口级别宣传它的使用看起来很奇怪。然后,不知情的人会将返回的指针放入 STL 容器中,以此类推。因此,如果您知道另一种常见的解决方案,非常欢迎您添加答案。

0 投票
3 回答
275 浏览

c++ - 创建“处理程序注册”类型架构时,我应该如何传递处理程序?

我出于学习目的在 C++ 中编写 UDP 客户端/服务器协议,其中从我的应用程序的服务器组件到应用程序的其余部分的通信是使用处理程序实现的。

例如,我可能会针对值 1 注册一个 Authorization 组件,并针对值 2 注册一个 TextMessage 组件。然后客户端首先向 Authorization 组件发送一两条消息以登录,然后开始向 TextMessage 处理程序发送文本消息。

这就是我现在所拥有的:

任何希望注册为组件的类只需继承 NetworkHandler 并调用

但是,我在决定如何通过处理程序时遇到了一些问题,作为一个新手等等。

我应该通过引用传递处理程序吗?这既简单又方便,但是所有权的问题开始发挥作用——调用函数可能不必担心无缘无故地保留引用。

我应该复制处理程序吗?这也很容易和方便,但是这里有一个问题是我的处理程序是否可复制,或者我是否需要从类外部保留对我的处理程序的引用。

我想知道的是,这种情况的常见最佳实践是什么?对不起文字墙。

0 投票
8 回答
4637 浏览

java - Java:组件如何知道它的所有者

假设我有一个 classA和一个 class B

我知道我可以通过 A 得到 B,因为 A拥有(或拥有)B: new A().getB()
但是如果我有B,我能得到A吗?

0 投票
2 回答
13975 浏览

c# - 获取具有“损坏”权限的文件的所有权

我正在努力克服以下情况。

给定一个存储在 NTFS 卷上的目录,其中:

  1. 目录所有者设置为其他人(例如非特权用户)
  2. 目录 DACL 配置为允许访问不包括系统或管理员的特定人群
  3. 目录上的 DACL 实际上不授予任何人获取所有权或更改 DACL 的访问权限

(或者简而言之,所有管理员都被锁定在文件夹之外)

但!

  1. 我运行的帐户具有管理权限(SeBackupPrivilege、SeSecurityPrivilege)
  2. 现有的 DACL 可以忽略,因为我正在写一个新的
  3. 使用其他工具(takeown.exe),我可以访问相关目录。

(或者简而言之,我有权修复 DACL/所有者)

我应该对以下代码没有问题:

但是,SetAccessControl调用会引发UnauthorizedAccessException。当我将其更改为仅调整所有者时,会发生同样的事情。当我只尝试调整 DACL 时,同样的事情。

我通过在 Process Explorer 中检查生成的进程来验证问题不是 UAC,并验证管理员组设置为“所有者”而不是“禁用”。我应该拥有执行此操作的所有必要权限(备份操作员在管理员面前应该是无关紧要的,但我添加它是为了测试)——但它只是不断抛出访问被拒绝。

相关技术网文档:http ://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx

  • “如果您拥有一个对象,您可以授予任何用户或安全组对该对象的任何权限,包括获得所有权的权限。”
  • 所有权可以通过以下方式转让:
    • 当前所有者可以将“取得所有权”权限授予其他用户,允许该用户随时取得所有权。用户必须实际取得所有权才能完成转移。(不幸的是,在这种情况下,所有者不能重新分配所有权。)
    • 管理员可以取得所有权。
    • 具有还原文件和目录用户权限的用户可以将所有权分配给任何用户或组。
  • 获得文件和其他对象所有权的能力是另一种情况,其中管理员维护系统的需要优先于所有者控制访问的权利。通常,只有当对象的当前所有者允许您这样做时,您才能获得对象的所有权。NTFS 对象的所有者可以通过授予另一个用户 Take Ownership 权限来允许另一个用户取得所有权;Active Directory 对象的所有者可以授予另一个用户修改所有者权限。拥有此权限的用户可以在没有当前所有者许可的情况下取得对象的所有权。默认情况下,该权限仅分配给内置管理员组。当当前所有者不再可用时,管理员通常使用它来获取和重新分配资源的所有权。

我在这里想念什么?