不要对右值做取地址操作
An rvalue does not necessarily have an address.
错误示范:
:::warning
kd_node Build_KD_Tree(kd_node parent, const int l, const int r){
…
}
kd_node a = &Build_KD_Tree(… , … , …);
:::
正确示范
:::info
kd_node Build_KD_Tree(kd_node parent, const int l, const int r){
…
}
kd_node temp = Build_KD_Tree(… , … , …);
kd_node a = &temp;
:::
想创建指向某个结构体的指针,最好 new 一下
主要是要调用一下结构体的构造函数把指针初始化一下,不然的话,如果之后用这个指针对结构体的成员直接进行操作,程序就会崩掉。
比如这样:
struct kd_node {
//...
};
int main(){
kd_node* a = new kd_node();
//...
return 0;
}
不能返回函数里面局部变量的地址
有时候我们希望函数的返回类型是指向某个结构体的指针。那么可能会写出来下面的错误代码:
:::warning
kd_node Build_KD_Tree(kd_node parent, const int l, const int r){
// …
return &kd_node(parent, null, null, memory_pool[l]);
// …
}
:::
或者像这样的错误代码:
:::warning
kd_node Build_KD_Tree(kd_node parent, const int l, const int r){
// …
kd_node temp = kd_node(parent, null, null, memory_pool[l])
return &temp;
// …
}
:::
这种情况下,编译是过不了的,会报 address of local variable ‘temp’ returned ,因为我们尝试把一个分配在了栈上的变量的地址返回给调用者,但其实当函数退出时,这个栈地址就失效了。
我们可以返回变量的值,而不是返回变量的指针。
如果我们偏要函数里面创造一个变量,然后把变量的地址返回出去的话,可以在创建时使用 new 把变量分配在堆上。
:::info
kd_node Build_KD_Tree(kd_node parent, const int l, const int r){
//…
return new kd_node(parent, null, null, memory_pool[l]);
//…
}
:::