1
8
我会说,在这种情况下 呼叫者 应该负责释放对象。您可以考虑各种选项,最简单的是:
您还可以考虑一些智能指针选项,例如
更新:
如果你的方法能够
|
2
3
你可以用一个智能指针,比如 shared_ptr 从Boost。
如果没有,你需要清楚地说明谁
拥有
对象。如果你要接管所有权或者把所有权留给来电者。
如果您打算接管所有权,请创建 下沉 方法,选择一个正确的名称是一个好主意,当然您需要在完成后自己删除对象。 |
3
2
首先,你需要分配 所有权 目标:你需要有一个一致的策略(和强制的!)关于“谁”有权删除对象。一旦这一点被明确地确定下来,你就不应该有遇到的问题。 一些策略:
第二,对于 跟踪使用 对于对象,您需要一个基础结构,如“智能指针”。这里有两个类别需要关注:
对于(1),“跟踪信息”是指针本身,而在(2)中,您需要更多的基础结构。 |
4
2
这是一个关于所有权的问题。
您需要决定谁拥有所有权(或者是否有共享所有权)。
你有几个选择。
在你的情况下,我建议1或2视情况而定。
|
5
1
你应该使用某种智能指针。
|
6
0
您需要决定所有权,或者:
(2是丑陋的,因为它意味着不同的代码负责分配和删除,但这可能是正确的解决方案-如果调用方想要保留对象,它还意味着复制参数)。 |
7
0
这两个都是C++语法意义上的有效选项,但我认为第二个选项在几乎所有的情况下都是糟糕的软件设计,并且允许一个函数中的两个选项在所有情况下都可能是糟糕的软件设计。
要么
调用类创建对象、调用方法并删除对象,
我认为在一个方法调用中,两个选项都应该被认为是合理的,这没有什么好的理由。从文档或注释中应该可以清楚地看到该方法使用的版本,然后由开发人员使用该方法,或者承担后果。 |
8
0
常见的行为是函数既不创建也不销毁对象。但是,有一些功能可以做到。常用的行话是“源流”。如果不使用更通用的智能指针,一个非常有用的约定是使用
好处是,即使您忘记了源函数的返回值,也不会出现内存泄漏。在语句末尾,返回的auto_ptr将销毁返回的对象。同样的,很明显,这个论点传递给了
|
9
0
内存应该由其所有者释放。通常,所有者是分配内存的实体,但在某些情况下,您可能允许转移所有权。
具体来说,如果
如何处理:
别那么做 .如果您分配内存,您需要拥有它。首先存储指针,以便删除内存:
或者更好,*首先不要动态地分配对象,消除所有权问题:
|
10
0
我还不能评论,但是……虽然我通常会强烈主张“造物主拥有它”的范式(你真的能证明其他的东西是正确的吗?)我认为
使用方法几乎需要转移所有权。也许询问您试图用这种用法完成什么是明智的,并且可以用另一种方式处理它吗?像一个引用临时而不是指针的重载?
|
11
0
好吧,我想我会把我的小石头加到大厦里去…尽管我不确定它是否会被阅读。 这是一个关于内存所有权的问题,它是你界面的角色传达这一含义:“这个方法是否会取得所有权”。
为了更好地表达所有权,使用原始指针通常是不好的。STL有个混蛋
对于一种方法,有几种方法可以接受参数:
我略过了简历的资格认证,因为这与我无关。 要点是,在这4个解决方案中,目标是明确的:
当然,这就是为什么
因此,如果调用者是否应该期望方法取得所有权,那么您的接口应该更清晰,一个简单的方法是使用重载。
很简单,你现在已经清楚谁在处理内存了! 同样的道理,您也可以使用这个重载技巧来自动检查指针是否无效。
但是我会避免滥用这个技巧,你最终会得到成千上万的方法。 所以请记住: 所有权语义最好用代码表示 而不是在评论中。 你马上就可以和它混合 使用RAII管理资源 这意味着你应该 永不分配 记忆到 原始指针 :使用智能指针表示资源的所有权,使用原始指针指向您不拥有的现有对象(可能为空,否则引用更好;)。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |