分配指针的方法之间有什么区别?
What's the difference between ways in assigning a pointer?
谢谢您检查我的问题。当我实施BST时,我刚刚遇到了一个真正的根本问题,那就是"分配指针的不同方法的区别?"我们都知道分配点可以使用:
int *p, q;
p = &q;
或:
int *p, *q;
p = q;
他们应该相同。但是在下面我的情况下,他们的工作完全不同:
template <typename T>
void Tree<T>::_insert(TreeNode<T>*& tree, const T& value, const unsigned& key)
{
// TreeNode<T> node(value, key);
// if(tree == nullptr) tree = &node;
TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;
else if(key < tree->index) _insert(tree->left, value, key);
else if(key > tree->index) _insert(tree->right, value, key);
else if(key == tree->index) std::cerr << "_insert: repeating key" << std::endl;
}
使用第一种方式(指出一种),该函数不会分配等于节点的树,而第二种方法则效果很好。
那么,这是我的错写的,还是自然不同?
请在第一种情况下注意:
// TreeNode<T> node(value, key);
// if(tree == nullptr) tree = &node;
node
是分配在 stack 上的对象。
在第二种情况下
TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;
node
分配在 HEAP 上。
区别在于,一旦_insert
函数返回,其堆栈框架就会弹出,并且所有局部变量/对象变得无效,因此您将有内存错误。
no,两种方式不应相同:
- 第一个分配
p = &q
是完全有效的,因为q
是内存中的实际对象,而p
是指向它的指针 - 第二个任务
p = q
将一个统一的指针q
分配给p
,这是不确定的行为。
这就是两个实现不同的原因。
如果您想将q
分配给p
,则需要先分配q
本身。例如,您可以将new int
分配给它:
int *p, *q = new int;
p = q;
但是,在这种情况下,您可以直接将new int
分配给p
。
int *p, q;
p = &q;
这意味着P现在具有整数Q存储在内存中的地址。
int *p, *q;
p = q;
在此中,您将存储在指针Q中的地址复制到第p。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?