是Foo*f =新的Foo好的C++代码

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.但你永远无法从外面说出来.这对班级用户完全透明.用户知道的所有内容都是向量将获取对象的所有权,并且在向量被销毁时它将被销毁.


Sad*_*ido 8

我认为,所有这些"...最佳实践......"问题的问题在于它们都在没有上下文的情况下考虑代码.如果你问"一般",我必须承认直接内存管理是完全可以接受的.它在语法上是合法的,并且它不违反任何语言语义.

至于替代方案(堆栈变量,智能指针等),它们都有它们的缺点.而且他们都没有灵活性,直接内存管理也有.您需要为这种灵活性付出的代价是您的调试时间,您应该了解所有风险.


Mic*_*son 7

没有.

在某些情况下,有充分的理由不使用自动内存管理系统.这些可能是由于循环引用等导致的性能,数据结构的复杂性等.

但是,如果你有充分的理由不使用更聪明的东西,我建议只使用带有new/malloc的原始poiner.看到无保护的分配让我害怕,让我希望编码员知道他们在做什么.

某些智能指针类如boost :: shared_ptr,boost :: scoped_ptr将是一个好的开始.(这些将是C++ 0x标准的一部分,所以不要害怕它们;))

  • 您是否认为"自动内存管理"仅包括引用计数?最简单的一个:"当对象超出范围时,在析构函数中释放"?这实际上是`scoped_ptr`已经做的了.那怎么不是"自动内存管理"? (2认同)

Joh*_*ohn 6

使用某种智能指针方案,您可以获得自动内存管理,引用计数等,只需很少的开销.你支付(内存或性能),但它可能是值得的,而不是一直担心它.

  • 假设"自动内存管理"*只能*引用引用计数有什么意义? (2认同)
  • 不对.`std :: vector <int> vec;`是自动内存管理.它分配的所有内存都会自动清理*.想想`auto`关键字(在其当前的前C++ 0x含义中).为什么你认为它被称为*auto*的所有东西?因为它*自动*管理对象的生命周期.所有局部变量和类成员都自动管理*以*开头.自动内存管理是默认设置.只有当我们跳过篮球并打电话给'新'时我们才会失去它,并且必须明确地创建基础设施以使其恢复. (2认同)

Nem*_*vic 6

如果您使用异常,那么实际上保证了一种代码可以导致资源泄漏.即使您禁用了异常,在手动将新配置与删除配对时也很容易进行清理.