c++对象指针作用域
C++ object pointer scope
我开始写一个二叉树,然后想出了这个例子,我不知道发生了什么。下面是代码:
#include<iostream>
using namespace std;
struct Node
{
Node *left, *right;
int key;
Node()
{
left = NULL;
right = NULL;
key = 0;
}
Node(int key)
{
left = NULL;
right = NULL;
key = key;
}
};
struct Tree
{
Node* root;
void Add(int k)
{
Node* t;
t->key = k;
root->left = t;
}
Tree(int key)
{
this->root = new Node(key);
}
};
int main()
{
Tree* tree = new Tree(5);
tree->Add(4);
cout<<tree->root->left->key;
return 0;
}
添加功能添加在树是什么让我困惑。所以,有一个指向Node对象的指针,但没有使用new关键字,而且在我看来,无论如何,堆中分配了内存,因为我可以到达对象。不应该走出范围被摧毁吗?为什么我可以拿到那个对象并打印出它的密钥?
可能内存属于您的程序,并且似乎没有什么不好的事情发生,因为您使用的内存很少。如果您使用了更多的内存,某些对象将拥有未分配的空间,并期望它保持不被修改。然后这段代码就会开始给你出问题。
你正在"解引用一个未初始化的指针"。例如,这里和这里都有与此相关的问题。如果这样做,编译器可能会崩溃,也可能不会:行为是未定义的。任何事情都可能发生,包括看起来事情正在工作。
应该使用new
这一行& help;
Node* t;
白马王子;就像:
Node* t = random_address;
表示下一行& help;
t->key = k;
白马王子;
代码无效。在这个函数
void Add(int k)
{
Node* t;
t->key = k;
root->left = t;
}
局部变量t
未初始化且值不确定。语句
t->key = k;
导致未定义的行为。
您正确地指出必须使用operator new。例如
Node* t = new Node( k );
然而,即使在这种情况下,函数也是无效的,因为它必须检查新键是小于还是大于根键。根据条件,应该有
root->left = t;
或
root->right = t;
相关文章:
- 全局作用域中函数指针的赋值
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何从类函数返回指向类作用域数组的指针?
- 块作用域中的函数指针定义
- c++ 指针在离开作用域后不会停留
- 混合指向已分配对象和作用域对象的指针
- 在一个作用域中推送五个对象指针,然后检查对象的布尔值是否为 false,会给出错误
- 空的唯一指针在离开作用域时调用析构函数
- 使用作用域内生成的指针初始化静态成员
- 提升::进程间managed_shared_memory指针有效作用域
- 什么是C++中的作用域指针
- 在释放了所有作用域内指针之后仍然可访问内存
- C++指针到指针作用域的问题
- 模板类中静态函数或指针的作用域解析
- 有没有一种方法可以通过使用指针来处理作用域
- 关于 C++(或 C)中的指针的函数作用域
- Boost作用域指针指向Boost线程
- 当类没有析构函数时,智能指针或作用域指针会删除对象吗
- 如何在作用域指针类中正确使用动态分配的不透明指针
- 如何传递作用域指针而不是this指针