我对C ++(以及学习Java)非常陌生。这是来自HW,但我认为我已经回答了硬件问题,而我只是想更好地了解指针。
说我有以下方法:
int cubed(int a) {
int * ptr;
*ptr = a * a * a;
return *ptr;
}
使用以下内容编译并正常工作:
int test = cubed(3);
我试图了解返回解除引用指针的原因。
This question说内存泄漏是个问题,但我不确定原因。也许是因为我不明白解除引用指针会发生什么。
左值是否只是在那时无限期地挂了?你真的要删除指针吗?任何见解都将不胜感激。
答案 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
,因此您的代码有时会崩溃。