c++ - 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(' ');
是什么导致了这个错误,我该如何纠正这个错误?
解决方案
正如错误消息所建议的那样,该表达式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;
};
推荐阅读
- linux - 在 Linux 中比较 2 个文件夹中每个字节的文件字节并查找重复项
- forms - 如何防止更新 CakePHP 3 beforesave() 中的字段?
- python - 如何根据 urls.py Django 中某个查询参数的值将 URL 路由到单独的视图?
- excel - 运行时错误 91 VBA - 尝试设置工作表但它一直说运行时错误?
- html - 具有自定义设计的侧导航栏
- javascript - 使用父滚动条而不是带有 Angular 虚拟滚动的子组件滚动条
- python - 如何使用 tensorflow 摄取分片 CSV
- docker - Google 容器注册表权限
- javascript - 如何让第二个动画开始,只有在第一个动画完成使用 Javascript 回调之后?
- python - 将 Excel zip 文件内容转换为实际的 Excel 文件?