静态vs动态分配一个只存储一个int的指针

时间:2014-04-02 20:34:02

标签: c++ pointers

我想知道为什么我需要第二个版本?

int* p; // version 1
int* p = new int; // version 2

3 个答案:

答案 0 :(得分:2)

在第一个版本中,指针没有指向任何东西,它是未定义的。版本2分配了内存并将p指向该新内存。您没有为指针本身分配空间,而是指向指针的内存。 (在两个版本中,指针本身都在堆栈上)

答案 1 :(得分:1)

假设代码出现在函数中:

第一个定义了int*类型的局部变量(即指针)。变量未初始化,这意味着指针没有值。它没有任何意义。它几乎没用,关于你唯一可以做的就是给它指定一个指针值[*]。所以你要对自己说,“我可以暂时定义变量,直到我有一个值来分配它吗?”

第二个定义类型为int*的局部变量(即指针),并且还动态分配类型为int的对象,并将该对象的地址分配给指针变量。所以指针指向int

动态分配一个int几乎总是一个坏主意。从某种意义上说,它不是无用的,至少你有一个int和一种访问它的方法。但是你已经为自己制造了一个问题,因为你必须跟踪它并释放它。

[*]你可以用未初始化的int*变量做的其他事情:取变量的地址;将其绑定到int*&类型的引用;将变量的地址转换为char*并一次检查一个字节的内存,只是为了看看你的实现在未初始化的变量中放了什么。没有什么令人兴奋的,而且至关重要的是,没有涉及任何int个对象,因为你没有。

答案 2 :(得分:0)

第一个指针

第一个指针,声明为:

int* p; 

仅分配存储指向int的指针所需的内存。实际大小是实现定义的。根据8.5 / 12,p对象包含的是 indeterminate

  

如果没有为对象指定初始值设定项,则默认初始化该对象。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,并且如果没有对该对象执行初始化,则该对象保留不确定的值,直到该值被替换(5.17)。

这意味着取消引用指针将导致未定义的行为

第二个指针

第二个指针,声明为:

int* p = new int;

动态分配int。这意味着对象的生命周期将在程序的退出处终止(不确定标准是否实际强制执行此操作,但我非常确定底层操作系统将在程序执行完毕后收回未使用的内存)或当你释放它。

除非operator new无法分配内存,否则可以安全地取消引用此指针(在这种情况下,它将抛出std::bad_alloc,或者从C ++ 11开始,另一个异常派生自std::bad_alloc

为什么在大多数情况下不应该使用第二个指针

内存管理是一个难题。我可以给你的主要提示是避免newdelete像瘟疫一样。只要你能以任何其他标准方式做某事,你应该更喜欢它。

例如,在这种情况下,我能够提出证明这种技术的唯一原因是有一个可选参数。您可以而且应该std::optional代替。