C ++:在函数内创建新对象并将其作为结果返回时,是否必须使用new运算符创建对象?

问题描述 投票:8回答:4

我有两个虚拟的问题使我困惑了一段时间。我确实做了一些在线搜索,并通读了很多c ++教程,但是找不到具体答案。

假设我们有一个名为Node的类,它是单链表的组成部分。

class Node
{
   int data;
   Node* next;
}

事实1:局部变量(非静态)将在相应功能退出时销毁。

Question1:情况如何?

Node* func()
{ 
    Node n; 
    Node* ptr=&n; 
    return n;
}

节点n是否会被销毁?或者,我们必须使用new运算符创建节点并返回指向堆内存的指针。如果两种方法都可行,哪种方法更好?

Question2:如何为节点类编写析构函数? (我在stackOverflow上找到了一些类似的问题,但这些答案集中在链接列表的析构函数上。我已经掌握了这一部分。我想要的正是Node类的析构函数。)>

--------------------------------------- EDIT -------- ----------------------------

感谢所有给我建议或指出我的错误的人。我想我得到了答案。以下是我从您的回答中记下的便条,这确实消除了我的困惑。

  1. 从函数返回堆栈存储器地址不是一个好习惯,因为它将导致未定义的行为。
  2. 返回堆内存可以,但是我们必须注意对象的销毁。
  3. 一种替代方法是从复制构造函数中受益,返回一个对象。

我有两个虚拟的问题使我困惑了一段时间。我确实做了一些在线搜索,并通读了许多c ++教程,但是找不到具体答案。假设我们有一个名为...

c++ constructor destructor
4个回答
8
投票

问题1


2
投票

您可以返回指向本地对象的指针,但是它将指向堆栈内存,因此结果可能令人惊讶。看下面的代码:


1
投票

您可能的意思是:


0
投票

否,您不必使用new从函数返回对象。您可以返回本地对象的副本。

© www.soinside.com 2019 - 2024. All rights reserved.