在 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++ 中何时使用指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何以及何时将倾斜指针与 cuda API 一起使用?

如何复制 C++ 指针数据? [复制]

何时使指针指向堆上的结构与堆栈上的结构? [复制]

如何正确删除 C++ 中的指针? [复制]

在 C++ 中通过指针捕获异常

在 C++ 中删除空指针是不是被认为是未定义的行为? [复制]