【问题标题】:Why or when to declare an int with a pointer? [duplicate]为什么或何时用指针声明 int? [复制]
【发布时间】:2017-06-15 06:07:52
【问题描述】:

这两者除了持续时间有什么不同吗?

int ptr;
int *ptr = new int;

我了解指针的概念,但我认为用指针来定义 int 并没有多大用处。

【问题讨论】:

  • 那么应该用指针声明什么,为什么?
  • 你使用它们的方式会有所不同; *ptr 必须使用指针一。
  • 一个在栈上,一个在堆上。您必须删除堆上的那个才不会泄漏内存。

标签: c++


【解决方案1】:

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

考虑最坏的情况:

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

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

【讨论】:

  • 请解释一下这里有什么问题。
  • (不是我的投票)没有错,只是无关紧要,而且对初学者有误导。
【解决方案2】:

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

例子:

int foo(int in)
{
   int i = in + 2;
   return i;
}

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

如果您在创建对象的范围之外需要对象,则使用堆上的对象。

int* foo(int in)
{
   int* ip = new int(in + 2);
   return ip;
}

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

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

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

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

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

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

【讨论】:

  • 谢谢,我明白了。
猜你喜欢
  • 2013-09-26
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多