我可以得到指向 nullptr 的指针的指针吗,它是否有效

Can I get a pointer to a pointer pointing to nullptr, is it valid

本文关键字:指针 是否 有效 nullptr 我可以      更新时间:2023-10-16

我对以下代码有一些疑问:

void b(int** a){
        int *c = new int;
        *a = c;
        **a = 120;
}
int main(){
        int *a = nullptr;
        b(&a);
        if(a)
                delete a;
        return 0;
}

我担心的是这可能会导致 UB,因为它是一个 nullptr,并且我在获得对它的引用时正在更改指针地址,但后来我开始认为这不应该是一个问题,因为我会有。某些地址 ->空。这个地址是有效的,所以我可以更改它。

我不止一次运行了这个测试,并且启用了 -fsanitize=地址,它工作正常。但是,这是对的吗?

我担心的是这可能会导致 UB,因为它是一个空

b()的参数a不是nullptr,它会在取消引用之前分配指向的指针,所以这不是一个问题。

我不认为你有内存泄漏,但你必须非常小心这样的事情:

#include <iostream>
void b(int** a)
{
  int *c = new int;
  *a = c;
  **a = 120;
  // if C is deleted then the *a needs to be set to nullptr
  //delete c;
  //*a = nullptr;
  // Not needed as this will just be defeferenced off the stack
  // *a and c are two different pointers in memory so this is fine
  c = nullptr;
}
int main(){
  int *a = nullptr;
  std::cout << "Before B, a=" << a << std::endl;
  b(&a);
  std::cout << "After B, a=" << a << std::endl;
  std::cout << "After B, *a=" << *a << std::endl;
  if(a)
  {
    delete a;
  }
  // a still has a pointer with an address and can't be trusted
  std::cout << "End A, a=" << a << std::endl;
  // On repl.it, it prints 0
  std::cout << "End *a, a=" << *a << std::endl;
  return 0;
}