Pau*_*han 16 c++ memory-leaks memory-management
通过我以前的旧C++期刊阅读,我发现了一些东西.
其中一篇文章断言
Foo *f = new Foo();
几乎是不可接受的专业C++代码,并且自动内存管理解决方案是合适的.
是这样吗?
编辑:改述:一般来说,直接内存管理对于新的C++代码是不可接受的吗?auto_ptr(或其他管理包装器)应该用于大多数新代码吗?
Mar*_*ork 20
这个例子非常像Java.
在C++中,如果需要,我们只使用动态内存管理.
一个更好的选择就是声明一个局部变量.
{
Foo f;
// use f
} // f goes out of scope and is immediately destroyed here.
Run Code Online (Sandbox Code Playgroud)
如果必须使用动态内存,请使用智能指针.
// In C++14
{
std::unique_ptr<Foo> f = std::make_unique<Foo>(); // no need for new anymore
}
// In C++11
{
std::unique_ptr<Foo> f(new Foo); // See Description below.
}
// In C++03
{
std::auto_ptr<Foo> f(new Foo); // the smart pointer f owns the pointer.
// At some point f may give up ownership to another
// object. If not then f will automatically delete
// the pointer when it goes out of scope..
}
Run Code Online (Sandbox Code Playgroud)
有一大堆os智能指针提供给int std ::和boost ::(现在有些在std :: tr1中)选择合适的一个并用它来管理对象的生命周期.
从技术上讲,您可以使用new/delete来进行内存管理.
但在真正的C++代码中,它几乎从未完成.手动执行内存管理几乎总是有更好的选择.
一个简单的例子是std :: vector.在封面下它使用new和delete.但你永远无法从外面说出来.这对班级用户完全透明.用户知道的所有内容都是向量将获取对象的所有权,并且在向量被销毁时它将被销毁.
我认为,所有这些"...最佳实践......"问题的问题在于它们都在没有上下文的情况下考虑代码.如果你问"一般",我必须承认直接内存管理是完全可以接受的.它在语法上是合法的,并且它不违反任何语言语义.
至于替代方案(堆栈变量,智能指针等),它们都有它们的缺点.而且他们都没有灵活性,直接内存管理也有.您需要为这种灵活性付出的代价是您的调试时间,您应该了解所有风险.
没有.
在某些情况下,有充分的理由不使用自动内存管理系统.这些可能是由于循环引用等导致的性能,数据结构的复杂性等.
但是,如果你有充分的理由不使用更聪明的东西,我建议只使用带有new/malloc的原始poiner.看到无保护的分配让我害怕,让我希望编码员知道他们在做什么.
某些智能指针类如boost :: shared_ptr,boost :: scoped_ptr将是一个好的开始.(这些将是C++ 0x标准的一部分,所以不要害怕它们;))
使用某种智能指针方案,您可以获得自动内存管理,引用计数等,只需很少的开销.你支付(内存或性能),但它可能是值得的,而不是一直担心它.
| 归档时间: |
|
| 查看次数: |
2061 次 |
| 最近记录: |