在以下代码中,如果Info::addPart1()多次意外调用,则会发生内存泄漏:
typedef struct
{
}part1;
typedef struct
{
}part2;
class Info
{
private:
part1* _ptr1;
part2* _ptr2;
public:
Info()
{
_ptr1 = _ptr2 = NULL;
}
~Info()
{
delete _ptr1;
delete _ptr2;
}
addPart1()
{
_ptr1 = new part1;
}
addPart2()
{
_ptr2 = new part2;
}
};
Info _wrapper;
_wrapper.addPart1();
_wrapper.addPart2();
Run Code Online (Sandbox Code Playgroud)
有没有C++成语来处理这个问题?
我可以改写addPart1并addPart2喜欢这样来保卫MLK
addPart1()
{
if(_ptr1 != NULL) delete _ptr1;
_ptr1 = new part1;
}
Run Code Online (Sandbox Code Playgroud)
这是一个好的解决方案吗?
在这里忍受我......
在遥远的过去,程序员使用像"jump"和"goto"这样的结构来进行流量控制.最终出现了常见的模式和构造类似于,do/while,函数调用和try/catch出现,意大利面被驯服.这些命名结构提供了有关intent的更多信息,而不是泛型goto,您必须检查上下文的其余代码以了解它正在做什么.在不太可能的情况下,你会看到一个有能力的编码员在现代代码中看到一个goto,你知道一些非常不寻常的事情正在发生.
在我看来,"删除"是内存管理的"转向".现代开发人员可以使用足够多的智能指针和容器类,大多数代码都没有理由包含单个显式删除(当然,除了智能指针实现之外).当你看到一个简单的"删除"时,你得不到关于意图的信息; 当你看到scoped_ptr/auto_ptr/shared_ptr/ptr_container时,你会得到更多.
即成语应该是希望通过使用适当的智能指针类型来编写无删除代码(这里几乎所有其他答案都推荐).
更新2013-01-27:我注意到Herb Sutter 关于C++ 11的精彩演讲包括一些类似的情绪,重新删除免费代码.
| 归档时间: |
|
| 查看次数: |
3188 次 |
| 最近记录: |