所以,我有一个函数返回一个指向动态分配的double的指针,我需要打印它所指向的值(我知道这很傻)。
double * ans1p = dot(v1, v2);
double ans1 = *ans1p;
cout << "Answer to problem 1:" << endl;
cout << ans1 << endl;
cout << *ans1p << endl;
第一个cout语句返回预期值。
第二个返回一些随机和意外的东西。有什么不同?似乎在两种情况下,打印的是ans1p指向的值。
我宁愿完全消除ans1及其cout语句。
好的,这是点功能:
double * dot(Vector &v1, Vector &v2) {
if (getLength(v1) != getLength(v2) ) {
std::cout << "Error: cannot perform dot product. Vectors must be " <<
"equal length." << std::endl;
return 0;
}
double result = 0;
for (unsigned int i = 1; i <= getLength(v1); ++i) {
result += (v1.elements[i] * v2.elements[i]);
}
double * resultPtr = new double;
resultPtr = &result;
return resultPtr;
}
为了记录,我不会尝试这样做,但它是作业的一部分。如果尺寸不匹配,我应该返回0指针。
好的,看着它,我可以看到当函数返回时结果超出范围,而我正在返回的指针指向那里(对吗?)。但是,我想不出怎么做我想做的事情。
我想我可以在函数外部声明一个双指针,将指针作为参数传递,并将其设置在函数内部。但是我想知道如何按照我的计划去做。虽然,考虑到它,但是一旦我理解了旧的方式发生了什么,这样做可能会更好,对吗?
答案 0 :(得分:2)
你的问题就在那里:
double * resultPtr = new double;
resultPtr = &result;
return resultPtr;
您在堆上分配新的double
...然后将本地变量的地址分配给resultPtr
。你得到一个内存泄漏(用new double
分配的内容丢失),然后你返回所述局部变量的地址。这是未定义的行为。这意味着任何事情都可能发生。
要解决此问题,您必须将作业更改为使用您刚分配的内存:
double * resultPtr = new double;
*resultPtr = result; // assign the value to the value pointed to resultPtr
return resultPtr;
或者,更好的是:
return new double(result);
考虑到OP 让使用指针,那么这是无关紧要的。留下作为奖金(因为无论如何我写了这个,删除它将是一种浪费)。
或者您也可以删除整个内存分配并返回result
。 double
很轻,我真的不明白为什么你绝对必须返回指针而不是值本身:
double dot(Vector &v1, Vector &v2) {
// check here and throw an exception if needed instead of returning 0
double result = 0.0;
for (unsigned int i = 1; i <= getLength(v1); ++i) {
result += (v1.elements[i] * v2.elements[i]);
}
return result; // return the value
}