创建新指针的方法

时间:2013-05-20 18:39:50

标签: c++ pointers c++11

我试图通过两种方式创建一个新指针,它们的含义是否相同?

int* ptn;
int* ptn(nullptr);

4 个答案:

答案 0 :(得分:10)

  

我试图通过两种方式创建一个新指针,它们的含义是否相同?

不,他们没有 - 或者至少,并非总是如此。

如果这些变量是在块作用域声明的,那么第一个将只给你一个未初始化的指针,而第二个将把指针初始化为空指针值。所以在第一种情况下:

int main()
{
    int* ptn; // This gives you an uninitialized pointer...
    if (ptn == nullptr) // ...so this is UNDEFINED BEHAVIOR!
    {
        // ...
    }
}

如果您在将其初始化为某个值之前使用ptn的值,则会遇到未定义的行为

另一方面,如果它们在命名空间范围内,则两个声明将是等效的,因为ptr将具有静态存储持续时间,并且无论如何都将被初始化为零:< / p>

int* ptn; // This pointer has static storage duration, will be zero-initialized...
int main()
{
    if (ptn == nullptr) // ...so no undefined behavior here!
    {
        // This will be entered...
    }
}

根据C ++ 11标准的第8.5 / 10段:

  

[注意:在任何其他初始化之前,静态存储持续时间的每个对象在程序启动时都是零初始化的   发生了。在某些情况下,稍后会进行额外的初始化。 - 后注]

答案 1 :(得分:1)

他们不一样;第一行可能不会将指针初始化为任何值,并且将是垃圾,尽管它通常是调试模式中的预定义垃圾,类似于0xcdcdcdcd,因此您可以识别尝试访问未初始化指针的位置;对于堆栈上的指针与堆不同。第二行将初始化为空指针的新c ++版本(以前只是'0');和第二个一样,或者你有int * ptn = nullptr,我发现它更常见。

答案 2 :(得分:0)

不,总是使用第二种形式!

第一个是未初始化的指针,它可以指向内存中的某个随机位置,访问它可能会导致其他疯狂行为中的访问冲突。

第二个将指针初始化为null。

答案 3 :(得分:0)

int * ptn;是一个指向任何东西或指向垃圾的指针。 int * ptn(nullptr);正在编译时初始化为空值。