【问题标题】:when use pointer or not in C++? [duplicate]在 C++ 中何时使用指针? [复制]
【发布时间】:2012-06-09 15:31:01
【问题描述】:

在 C++ 中,我有两个这样的代码块:

Base *base = new Base();
base->showName();

还有:

Base base;
base.showName();

我不知道我们什么时候使用指针,什么时候不使用?有什么不同,什么更好?

【问题讨论】:

  • 说真的,你甚至没有尝试过?我不是你的编译器。
  • 是的!只是类型错误!对不起!但是,请专注于主要问题!无论如何,谢谢!
  • 我有一种非常强烈的感觉,这是一个 10 倍的副本,但我也不想搜索它。
  • 在这种情况下,我已经在这个答案中解释了这一点:stackoverflow.com/questions/8839943/…
  • @R.MartinhoFernandes:您的回答对初学者来说是一个很好的解释。但是,您没有提及异常安全。

标签: c++ pointers


【解决方案1】:

您显示的第一个代码是内存泄漏。

第二个 sn-p 是 Java,而不是 C++。问题已被编辑为使用我建议的代码。

一般来说,在 C++ 中你应该避免使用new,除非你真的需要动态生命周期。相反,写:

Base base;
base.showName();

这样更好,因为

  • 速度更快,无需堆分配。
  • 您不必记住释放内存,编译器会在作用域结束时自动执行此操作。
  • 它是自动异常安全的。在堆栈展开期间,将调用析构函数并回收内存。

如果对象需要超出范围的末尾,您应该使用:

unique_ptr<Base> base(new Base());
base->showName();

现在unique_ptr 将在unique_ptr 死亡时为您释放内存,并且它也是异常安全的。当您返回 unique_ptr 时,所有权将转移给调用者,他可以获得自动清理的好处。

【讨论】:

  • 为什么第一块是内存泄漏?我编译了,没问题!
  • 仅仅因为它编译,并不意味着它的“OK”。
  • 是的!如果我有一个函数会发生什么:doSomething(),在这个函数中我创建Base *base = new Base(),使用后我不删除*base。如果在main(),我使用doSomething(),我会不会出现内存泄漏?!
  • @Kingfisher,我真的建议您阅读 cmets 中发布的链接。当您在堆上为其分配空间时,您会发生内存泄漏,但从不释放它,因此它一直坐在那里无法被其他任何东西使用。
猜你喜欢
  • 2018-04-22
  • 2021-11-14
  • 2017-01-07
  • 1970-01-01
  • 2018-05-05
  • 2016-03-18
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多