【发布时间】:2011-01-03 15:44:39
【问题描述】:
通过阅读我的旧 C++ 日志,我发现了一些东西。
其中一篇文章断言
Foo *f = new Foo();
基本上是几乎不能接受的专业 C++ 代码,自动内存管理解决方案是合适的。
是这样吗?
编辑:改写:对于新的 C++ 代码,直接内存管理是否不可接受,一般? 大多数新代码是否应该使用 auto_ptr(或其他管理包装器)?
【问题讨论】:
-
这样的问题让我觉得我在与其他人不同的星球上工作。以下所有答案都表明 new/delete 已过时、危险、邪恶、已弃用;在我的(大)公司,它基本上是我们用于分配动态对象的唯一机制!我们有容器类,但它们都只是调用下面的 new/delete。
-
注意:
Foo* f = new Foo完全有效。 -
@Crashworks:他们在下面做什么并不重要。在下面,您的循环或函数调用只是一个 goto,但这并不意味着“goto 可以使用”。下面,每个指针和引用都是通过破解内存地址来实现的,但这并不意味着您可以安全地将指针视为内存地址。这些都被抽象出来了,就像 new/delete 通常在容器类和 RAII 包装器后面抽象出来一样
-
apropos of nothing:我的一个朋友曾经编写了一个编译器,带有警告“警告:过度使用元语法变量 'foo'”(想想看,这可能是错误 B-)
-
可能值得注意的是,上述问题不是关于仅仅调用
new来分配一个Foo。它是关于使用new然后将结果存储在原始指针中。由于没有提及其他内容,我假设指针也没有作为 RAII 类中的私有成员隐藏起来,而是实际上被传递并直接在应用程序中使用。而且那是一种危险的做法,无论“new是邪恶的”
标签: c++ memory-management memory-leaks