![]() |
1
10
使用智能指针,如 boost:shared_ptr , boost:scoped_ptr 建议管理原始指针。 auto_ptr 很难处理,你需要注意。 |
![]() |
2
5
你应该读一下
smart pointer idiom
关于
RAII
.
我建议看一下新的技术报告(TR1)。
|
![]() |
3
5
在这里忍受我… 在遥远的过去,程序员使用诸如“跳转”和“goto”这样的结构来进行流控制。最终,出现了常见的模式和结构,比如for、do/while、函数调用和try/catch,意大利面也被驯服了。这些命名的构造提供了更多关于意图的信息,而不是一般的goto,在这里您必须检查代码的其余部分以了解上下文,以了解它在做什么。在不太可能的情况下,您会看到一个称职的编码人员在现代代码中发现了一个Goto,您知道发生了非常不寻常的事情。 在我看来,“删除”是内存管理的“goto”。对于现代开发人员来说,有足够多的智能指针和容器类可供使用,大多数代码几乎没有理由包含单个显式删除(当然,智能指针实现除外)。当你看到一个简单的“删除”时,你不会得到关于意图的信息;当你看到一个作用域的容器时,你会得到更多。 例如,习惯用法应该是希望使用适当的智能指针类型(这里几乎所有其他答案都建议这样做)编写删除自由代码。 2013-01-27更新: 我注意到赫伯·萨特的 excellent talk on C++11 包括一些类似的情感重新删除自由代码。 |
![]() |
4
4
删除前检查非零指针是多余的。
处理这种情况的常见方法是
将指针归零可确保不存在任何悬空指针,例如,在Part1构造引发异常的情况下。 |
![]() |
5
3
您建议的修复将起作用(当然,如果调用两次addPart2(),则仍然存在内存泄漏的风险)。一种更安全的方法是使用Boost库集合(www.boost.org)中的作用域指针,它是一个类似于指针的容器,但可以确保在容器被破坏时删除其目标。你的修改后的课程会看起来像
作为一般原则,最好避免编写需要显式删除指针的代码。相反,尝试使用在适当的时间自动执行此操作的容器。对于这类事情,Boost是一种很好的资源。 所有这些都假设你有一个原因,ptr1和ptr2必须是指针。如果不是,最好将它们变成普通对象;然后您可以免费获得内存管理。 |
![]() |
6
2
而使用构造是初始化。
但在这种情况下,您也可以在堆栈上创建部件,因此不需要新建和删除。
但是我想您希望指针被懒惰地创建,那么我不建议创建负责初始化的公共类方法。当类需要分配它们时,这应该在类内部处理。 |
![]() |
7
1
如果你希望它有懒惰的行为,你可以考虑这样做:
你建议的方式也是一种选择,这取决于你希望它如何表现。 但也有人提出了更好的方法,但是我们真的不知道你为什么这么做以及周围的代码是如何工作的… |
![]() |
8
1
我同意小组的意见,你应该使用某种智能指针。 如果您决定继续使用裸指针,请注意上面的类没有您定义的复制构造函数。因此,C++编译器已经为您定义了一个只做所有指针的简单副本;这将导致双重删除。您需要定义自己的复制构造函数(或者至少创建一个存根私有复制构造函数,如果您认为不需要复制构造函数的话)。
您将遇到与默认分配运算符类似的问题。 如果选择正确的智能指针,这些问题将消失。:) |
![]() |
9
0
选项1:使用Java: 选项2:使用自动指针
|
![]() |
10
0
你应该看看 RAII |
![]() |
11
0
处理内存泄漏的最极端的可能方法是 boehm 垃圾收集器,一个保守的Mark&Sweep收集器。有趣的是,除了其他答案中提供的所有好建议外,还可以使用这个方法。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 6 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 6 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 6 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 6 月前 |