关于C++:为什么或何时用指针声明int?


Why or when to declare an int with a pointer?

本问题已经有最佳答案,请猛点这里访问。

除了持续时间外,这两个有什么不同吗?

1
2
int ptr;
int *ptr = new int;

我理解指针的概念,但我不认为它有多大的用处来处理一个带有指针的int。


如果不需要在创建对象的作用域之外的对象,则可以使用堆栈上的对象。

例子:

1
2
3
4
5
int foo(int in)
{
   int i = in + 2;
   return i;
}

i不需要在foo之外。因此,可以在堆栈上创建一个对象并返回其值。

如果需要在创建堆的作用域之外的对象,可以使用堆上的对象。

1
2
3
4
5
int* foo(int in)
{
   int* ip = new int(in + 2);
   return ip;
}

ip指向的指针从foo返回,预期由调用函数使用。因此,需要在堆上创建一个对象并返回它。

这就是差异的概念方面。通常,如果您谈论的是int,则不需要使用堆中的对象。当需要返回数组时,差异变得很重要。

1
2
3
4
5
int* foo()
{
   int arr[] = {1, 2, 3, 4};
   return arr;
}

该函数将是一个问题,因为它返回的指针在函数返回时将无效。

1
2
3
4
5
int* foo()
{
   int* arr = new int[4]{1, 2, 3, 4};
   return arr;
}

这将起作用,因为返回的指针将指向有效的对象,即使在函数返回之后也是如此。但是调用函数必须负责释放内存。


从性能的角度可以看出差异。

考虑最坏的情况:

在这种情况下,所有需要的内存都将在同一页上。

int *ptr = new int;在这种情况下,ptr的地址可以在一个页面上,它所指向的内存可以在不同的页面上,这可能导致在间接访问内存时出现页面错误,即*ptr