不要对右值做取地址操作

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 一下

主要是要调用一下结构体的构造函数把指针初始化一下,不然的话,如果之后用这个指针对结构体的成员直接进行操作,程序就会崩掉。
比如这样:

  1. struct kd_node {
  2. //...
  3. };
  4. int main(){
  5. kd_node* a = new kd_node();
  6. //...
  7. return 0;
  8. }

不能返回函数里面局部变量的地址

有时候我们希望函数的返回类型是指向某个结构体的指针。那么可能会写出来下面的错误代码: :::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]);
//…
} :::