C ++:设置指向nullptr的指针和将其初始化为新的变量类型之间的区别

时间:2016-04-28 21:33:55

标签: c++ pointers new-operator nullptr

我正在学习C ++,我知道'新'关键字用于将内存中的地址分配给指针。我认为使用'nullptr'初始化一个指向任何东西的指针。那是对的吗?参考示例:

//using nullptr
int *x = nullptr; //this is just a pointer that points to nothing and
                  //will need to be initialized with an address before it  
                  //it can be used. Correct?

//using new
int *x = new int; //this is basically giving x an address in memory. Will the 
                  //address have some residual value stored in it or will
                  //it contain zero?

你什么时候使用一个而不是另一个?新的仅用于动态内存分配还是有其他应用程序?如果你只是声明它然后再初始化它,为什么要初始化一个指向nullptr的指针?

感谢您的帮助!

6 个答案:

答案 0 :(得分:2)

您对new intint *x = new int;的理解不正确(或至少,您的措辞不正确)。

new int分配一些内存。它不“将内存分配给指针”,它只是分配内存。它提供了一个指向该内存的指针,该指针以前不存在。

int *x;还为名为x的变量分配内存。 x是一个变量,其值是另一个对象的地址。 (与其他类型的变量相反,例如,其值可以是数字或字符串)。

int *x = nullptr;表示x包含一个名为“空指针”的特殊值,该值不表示任何其他对象。

int *x = new int表示x保存由new int分配的内存块的地址。因此,此行中涉及两个分配:xnew分配的未命名内存。

在后一种情况下,您可以分别输出每个分配的地址,例如:

cout << &x << ',' << x << '\n';

答案 1 :(得分:1)

new int()你是对的。 int *x = nullptr;的值是x,而nullptr是...嗯...让我们问专家:What exactly is nullptr?无论如何,这并不是什么都没有。它只是保证是一个安全的停车位,直到指针可以更好地使用。

nullptr读取int *x = new int指向的值,x将为Undefined Behaviour。您可能会获得剩余价值,但谁能肯定地说出来?

*x阅读int *x = new int();将获得0.

*x阅读int *x = new int(1000000);将获得1000000。

如果您没有任何要点,请使用*x作为占位符。不要仅仅为了指向指针而分配存储空间。这是浪费的内存,浪费时间分配和解除分配,如果你忘记nullptr它就是潜在的内存泄漏。 delete是安全的。您可以测试nullptr并对其指出的信息质量做出决策。如果您不确定指针是否在使用中,您可以nullptr delete而不用担心肮脏。

答案 2 :(得分:1)

int *x = nullptr; 

// some code here that might under some condition
// lead to an actual object address being stored in x

if (x)
{
  // do some stuff here which is only performed if 
  // x doesn't contain a nullptr value anymore
}

指针实际上只指向一个对象时,它不会起作用。 nullpointer值绝对常见。您可以检查指针是否为nullptr,并且该检查需要指针初始化。

不必使用实际地址进行初始化。

你想要初始化一个指针就像任何其他未初始化时具有固定值的基本类型一样:直接给它一个有效值,而不必记住你仍然需要初始化它。

指针变量就像任何其他基本变量一样。

  • 它驻留在具有sizeof(int*)字节内存的堆栈上,用于存储int类型的地址
  • 如果没有初始化程序,则不会初始化(不确定)
  

你什么时候用一个而不是另一个?

第一个(nullptr):如果指针实际上可能保持为nullptr。 第二个(new int):当你知道你实际上需要分配的整数时。

PS:现在,原始指针应该很少见(出于好的理由)。

答案 3 :(得分:1)

是的,您对这两项任务的描述通常是正确的。

关于为什么要初始化指向NULL的指针的问题,这样你的代码可以在以后对NULL进行测试。通常的范例是,如果指针是NULL,那么你知道它没有被初始化,也没有指向任何东西。如果它是非NULL,那么可能它指向一个有效的对象,你可以使用它。虽然该范例意味着当指针所指向的对象被删除或以其他方式呈现无效时,您需要确保将指针设置回NULL。您可能希望了解智能指针的工作方式,而不是常规的&#34; dumb&#34;指针。

答案 4 :(得分:0)

您的理解是正确的。 nullptr是一个很好的初始化值,表示指针没有指向内存。此外,对delete的{​​{1}}操作是安全的,而nullptr对任意值(通常在您不初始化指针时就是这种情况)可能会导致分段错误。

使用delete时,如果您希望将内存初始化为零,则应使用new。否则,内存可能有残留数据。

答案 5 :(得分:0)

  

我认为使用nullptr初始化一个指向任何东西的指针。那是对的吗?你什么时候用一个而不是另一个?如果你只是声明它然后再初始化它,为什么要初始化一个指向nullptr的指针?

是。需要记住的重要一点是,只要为指针分配内存,就必须对其进行管理。所以nullptr是一个标记值,意味着指针不指向任何东西。

  

新的仅用于动态内存分配还是有其他应用程序?

这是new唯一功能。您可以使用展示位置new来专门处理此行为,但您仍在分配内存。