【问题标题】:Is this a bad c++ object construction?这是一个糟糕的 C++ 对象构造吗?
【发布时间】:2016-10-05 16:23:57
【问题描述】:

我在一些地方看到过这样构造的对象:

Foo foo;
foo = *(new Foo());

在我看来,这是非常错误的。 new 运算符为 Foo 分配内存,然后取消引用该指针并用于将内容复制到原始且已构造的 foo 对象。由于指针丢失,分配的内存泄漏。

这是邪恶的,永远不应该做,还是我错过了什么?

【问题讨论】:

  • 这是真的。 .
  • 你说得对,太可怕了!当不需要真正的动态对象(Java 风格)时,不必要的Foo *foo = new Foo(); 分配已经够糟糕了,但这是邪恶的。
  • 我想这种初始化来自 Java/C# 程序员试图创建新对象,注意到编译器不允许他们这样做,因为 foo 是一个对象而不是指针,并添加 * 所以编译器很高兴..
  • 如果一个 java/c# 程序员在现代 C++ 中做了一个新的,你可能会认为它是错误的。他们习惯于到处做新的事情,而在 C++ 中,这几乎总是最糟糕的事情。

标签: c++


【解决方案1】:

这是非常非常可怕的,是的,但没有保证内存泄漏。

这取决于Foo 的类型。

在实践中,永远不会存在不是内存泄漏的类型,但原则上可以定义例如

struct Foo
{
    std::unique_ptr<Foo> p;
    void operator=( Foo& o ){ p.reset( &o ); }
};

我添加了可怕的不兼容标准容器void 结果类型,只是为了更好地衡量。 :)

那么,关于

分配的内存泄漏,因为指针丢失。这是真的还是我错过了什么?

...您¹只是错过了实习生的案例,该实习生出于某种莫名其妙的原因直接从此 SO 答案中复制了上述代码并将其插入公司的 Big Application™ 中。

注意事项
¹ Martin Matilla 就这个问题写了in a comment:“我想这种初始化来自 Java/C# 程序员试图创建新对象,注意到编译器不允许他们这样做,因为 foo 是一个对象而不是指针,并且添加 * 以便编译器满意。”,这是另一种可能性。

【讨论】:

  • 它是如何依赖的?
  • 你必须非常努力地工作才能使它不泄漏:-)
  • 为了不泄漏,你可以覆盖 new/delete 操作符。
  • @UKMonkey:是的,这是另一种可能性。分配函数可以简单地抛出一个异常,或者终止程序。但我认为这不完全符合问题的精神,代码以某种方式“有效”。
  • 哦 - 完全同意这与 C++ 的行数一样邪恶,但让它不泄漏并不难,只需稍加思考......
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2012-09-06
  • 2011-08-01
相关资源
最近更新 更多