在 C++ 中何时使用指针? [复制]
Posted
技术标签:
【中文标题】在 C++ 中何时使用指针? [复制]【英文标题】:when use pointer or not in C++? [duplicate] 【发布时间】:2012-06-09 15:31:01 【问题描述】:在 C++ 中,我有两个这样的代码块:
Base *base = new Base();
base->showName();
还有:
Base base;
base.showName();
我不知道我们什么时候使用指针,什么时候不使用?有什么不同,什么更好?
【问题讨论】:
说真的,你甚至没有尝试过?我不是你的编译器。 是的!只是类型错误!对不起!但是,请专注于主要问题!无论如何,谢谢! 我有一种非常强烈的感觉,这是一个 10 倍的副本,但我也不想搜索它。 在这种情况下,我已经在这个答案中解释了这一点:***.com/questions/8839943/… @R.MartinhoFernandes:您的回答对初学者来说是一个很好的解释。但是,您没有提及异常安全。 【参考方案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 中发布的链接。当您在堆上为其分配空间时,您会发生内存泄漏,但从不释放它,因此它一直坐在那里无法被其他任何东西使用。以上是关于在 C++ 中何时使用指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章