首页 > 解决方案 > c ++:错误:获取临时地址[-fpermissive]

问题描述

我正在尝试用二叉树做一些实验。我运行了以下代码:

#include<iostream>

using namespace std;

struct tree{
   char data;
   tree *left=NULL;
   tree *right=NULL;
   tree *parent=NULL;
};   


tree newNode(char d)
{
   struct tree node;
   node.data = d;
   return node;
}
int main()
{

   struct tree currentNode = newNode(' ');
  currentNode.left = &newNode(' ');
         return 0;
}

我收到此错误:

error: taking address of temporary [-fpermissive]

currentNode.left = &newNode(' ');

是什么导致了这个错误,我该如何纠正这个错误?

标签: c++

解决方案


正如错误消息所建议的那样,该表达式newNode(' ')创建一个临时对象。tree这是一个对象,其生命周期仅限于它出现的语句。这意味着,过了那个分号,该对象将不再存在。

对于您正在执行的结构类型,您可能需要动态内存分配。一种(不好的)方法是tree* ptr = new tree;(在 newNode 中)。这很糟糕,因为如果您不小心编写适当的析构函数,它可能会泄漏资源。最好unique_ptr在类中使用 a 作为指针tree

#include <memory>

struct tree{
   char data;
   std::unique_ptr<tree> left = nullptr;
   std::unique_ptr<tree> right = nullptr;
};

接着:

currentNode.left = std::make_unique<tree>(' ');

如果你必须有一个parent指针,你必须使用std::shared_ptr和的组合std::weak_ptr来避免shared_ptr循环。

struct tree {
   char data;
   std::shared_ptr<tree> left = nullptr;
   std::shared_ptr<tree> right = nullptr;
   std::weak_ptr<tree> parent = nullptr;
};

另请注意:为什么“使用命名空间标准;” 被认为是不好的做法?


推荐阅读