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

时间:2017-10-20 15:21:17

标签: c++ dereference

我对以下代码有疑问:

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,我正在更改指针地址,因为我得到了它的引用,但后来我开始认为这应该不是我将要遇到的问题。 一些地址 - > nullptr。这个地址有效,所以我可以改变它。

我多次运行此测试并且启用了-fsanitize = address并且工作正常。 但是,这是正确的吗?

2 个答案:

答案 0 :(得分:5)

  

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

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

答案 1 :(得分:0)

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

#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;
}