【问题标题】:C++ pointer and reference with new keyword when instantiating实例化时使用 new 关键字的 C++ 指针和引用
【发布时间】:2012-03-06 09:09:57
【问题描述】:

当我想用 C++ 实例化一个类时,我通常会这样做

Book bk = new Book();

我的教授最近这样做了

Book &bk = *new Book();

他只告诉我他会使用引用来使用点(例如 bk.getTitle();) 运算符而不是箭头(例如 bk->getTitle();)。我理解这部分代码,但是当您将 * 运算符与 new 结合使用时会发生什么?

提前致谢

完整的示例代码可以找到here它是main函数中的arraystack

【问题讨论】:

  • 所以你的教授教你如何泄漏内存,太棒了。
  • 如果您的教授将该代码用于其他任何事情,而不是作为您确实不应该做的事情的示例,那么您应该找一位新教授。
  • 可能你的教授说,const Book &bk = Book();。如果不是这样,我真的不明白你教授的意思。
  • @Mahesh :问题中的语法是有效的,它的语义是极其错误的。
  • @Mahesh 你可以做delete &bk,但这仍然是无意义的。 @OP 找一位新教授。

标签: c++ class pointers reference


【解决方案1】:

这个:

Book &bk = *new Book();

几乎等同于:

Book *p = new Book();  // Pointer to new book
Book &bk = *p;  // Reference to that book

但是有一个关键的区别;在原始代码中,您没有指针可用于在完成动态分配的对象时使用 delete ,因此您有效地创建了内存泄漏。

当然,你可以这样做:

delete &bk;

但那是非常非惯用的 C++,而且很可能在以后引起问题。

总而言之,编写这样的代码绝对没有充分的理由,所以不要这样做。以下任何一种都可以:

Book bk;
Book bk = Book();

【讨论】:

  • 谢谢,我想我不会用它。这门课更多的是关于设计模式而不是关于 C++,所以我将忽略这种编程风格并按照我的方式去做。
  • 你肯定没有造成内存泄漏,我认为这是一个巨大的夸大其词
  • @Seth : 原来的代码确实有漏洞……你什么意思?
  • @SethCarnegie:这就是我说“有效”的原因。但是需要编写诸如delete &bk 之类的精神错乱的东西会导致各种语义问题,这反过来又会导致忘记清理某些东西。
【解决方案2】:

我发现了一种让我思考这种语法的情况。考虑一个指向Base 类的智能指针,它必须保存一个指向派生类的指针,并且您希望在构造之后访问派生类的一些非虚拟事物。在这种情况下,这样的事情是合法的,可能还不错:

Derived & d = * new Derived();

d.d_method( ..whatever.. );
d.d_member = ..whatever..;
...

std::unique_ptr<Base> p( &d );

最后我还是更喜欢小箭头而不是奇怪的 & 符号:

Derived d = new Derived();

d->d_method( ..whatever.. );
d->d_member = ..whatever..;
...

std::unique_ptr<Base> p( d );

但我认为在这种情况下,这只是个人喜好问题,尤其是当您访问一致数量的方法时。

导致泄漏或delete &amp;d; 的其他事情只是糟糕、糟糕、糟糕。

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 2015-03-02
    • 2021-05-16
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多