2

我正在尝试使用两种方式创建一个新指针,它们的含义相同吗?

int* ptn;
int* ptn(nullptr);
4

4 回答 4

10

我正在尝试使用两种方式创建一个新指针,它们的含义相同吗?

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

如果这些变量在块范围内声明,第一个只会给你一个未初始化的指针,而第二个会将指针初始化为空指针值。所以在第一种情况下:

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

如果您在将ptn其初始化为某个值之前使用 anyhow 的值,您将遇到undefined behavior

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

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 段:

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

于 2013-05-20T18:40:51.840 回答
1

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

于 2013-05-20T18:41:40.810 回答
0

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

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

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

于 2013-05-20T18:42:02.673 回答
0

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

于 2013-05-20T18:42:43.197 回答