【问题标题】:Using *new in c++ [duplicate]在 C++ 中使用 *new [重复]
【发布时间】:2015-04-26 00:25:46
【问题描述】:

我正在用 Xcode 编写一个简单的 C++ 程序,它有一个 Message 类。在我的主要内容中,我想声明一条新消息并将其添加到消息列表中。 Xcode 建议我使用:

messages.push_front(*new Message(messageID));

谁能解释 *new 的作用。我是在为 Message 对象动态分配内存还是在堆栈上创建 Message 的实例? 我已经检查了 Xcode,如果使用它并且不删除实例,则没有内存泄漏,所以我假设它正在堆栈上分配。

【问题讨论】:

  • “我已经在 Xcode 中检查过,如果使用它并且不删除实例没有内存泄漏,所以我认为它是在堆栈上分配的。” 你是怎么做到的检查这个?你的假设是完全错误的。
  • 显然我还有很多东西要学。我使用的是 Xcode 的泄漏工具,我认为它没有显示任何问题。但感谢您的反馈。
  • messages 是什么类型?是std::deque<Message> 吗?您的代码看起来像泄漏。我想知道 XCode 的建议是否只是看到您正在调用 push_front,我怀疑它需要 const Message&,并且看到您正在使用 Message 指针调用它,因此建议您需要取消引用它,而不警告您那是一个泄漏。你可能想要messages.push_front(Message(messageID));

标签: c++ xcode


【解决方案1】:

您在堆上动态分配Message,然后取消引用它以通过引用传递它。

push_back 的重载之一是push_back(const T& value),因此该值首先在堆上分配,然后取消引用并将其引用传递给函数。

现在这没用了,因为您可以直接使用Message(messageID) 分配它并将其传递给方法。此外,由于没有与new 关联的delete,因此您正在生成泄漏,并且您无法释放它,因为您没有将返回的指针绑定到任何地方。

除了直接传递Message(messageID) 和可能使用emplace_back 之外,push_back 可以从集合内对象的副本构造中保存。

【讨论】:

  • 感谢您的清晰解释。我还注意到我可以使用 Message(messageID) 但只是想知道 *new 做了什么,因为我找不到任何关于此的信息。非常感谢关于 emplace_back 的建议。我还没有听说过,会调查一下。
  • 在这里您可以找到emplace_back 可以更好的原因和方法:stackoverflow.com/questions/23717151/…
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2011-12-04
  • 2015-04-11
  • 2011-07-09
相关资源
最近更新 更多