为什么C ++方法不能返回一个解除引用的指针?

时间:2014-04-03 01:04:48

标签: c++ dereference

我对C ++(以及学习Java)非常陌生。这是来自HW,但我认为我已经回答了硬件问题,而我只是想更好地了解指针。

说我有以下方法:

int cubed(int a) {
  int * ptr;
  *ptr = a * a * a;
  return *ptr;
}

使用以下内容编译并正常工作:

int test = cubed(3);

我试图了解返回解除引用指针的原因。

This question说内存泄漏是个问题,但我不确定原因。也许是因为我不明白解除引用指针会发生什么。

左值是否只是在那时无限期地挂了?你真的要删除指针吗?任何见解都将不胜感激。

2 个答案:

答案 0 :(得分:7)

你读的问题是不同的。说你有这个代码:

int cubed(int a) {
  int* ptr = new int;
  *ptr = a * a * a;
  return *ptr;
}

现在,您正在泄漏动态分配的int,因为您要返回它的副本,而不是delete原始文件。

您的代码实际上更糟因为,您只需通过未初始化的指针写入不属于您的内存,而不是使用new进行分配。实际上,您正在写入不存在的int

应该做的是:

constexpr int cubed(const int a)
{
   return a*a*a;
}

或者只是在呼叫站点调用std::pow(value, 3)

答案 1 :(得分:1)

您的代码中没有内存链接,但还有另一个大错误。

您在函数int * ptr;中声明int cubed(int a),因此它是一个局部变量。

ptr的值是随机的 - 可能是NULL,可能指向垃圾,可能指向一些完全有效的地址。您没有初始化变量ptr,因此您的代码有时会崩溃。