我有一个像
这样的功能template <class Type>
myFunc(Type** arrayToBeFilled);
我称之为:
double* array = NULL;
myFunc(&array);
在函数内部,我用strtod函数读取和解析数字:
//这里有文件打开,获取每行的行数和双打数
...
char *inputString = new char[LONG_STRING_SIZE];
char *pNext = NULL;
(*arrayToBeFilled) = new Type[length*rowSize];
for (int i=0; i<length; i++)
{
source.getline(inputString, LONG_STRING_SIZE);
pNext = NULL;
for (int j=0; j<rowSize; j++)
{
double d = strtod(inputString, &pNext);
(*arrayToBeFilled)[i*rowSize+j] = d;
inputString = pNext;
pNext = NULL;
}
}
变量d仅用于检查调试器 - 运行时它很好。 但在填充数组后,我尝试打印它(仅供检查)
for (int i=0; i<length; i++)
{
for (int j=0; j<rowSize; j++)
{
cout<<(*arrayToBeFilled)[i*rowSize+j]<<" ";
}
cout<<"\n";
}
这里有糟糕的输出 - 其他数字,有时堆腐败等等。我正在将它打印进出功能 - 结果相同。我不能删除这个数组没有或没有删除函数 - 运行时错误跟着我!
答案 0 :(得分:2)
为什么在C ++中使用原始C数组?如果您使用 STL类(如std::vector
而不是原始new[]
),您的代码将变得更清晰,更易于阅读和维护(例如,您不需要显式{{ 1}}调用:析构函数将清理堆内存)。一般来说,在现代C ++中,规则是“如果你正在编写新的或删除,你做错了”(有一些例外)。
另请注意,使用C ++ 11移动语义,您只需返回delete[]
而不是使用输出引用/指针参数:
vector
在您的函数体内,而不是您的代码
template <typename Type>
inline std::vector<Type> myFunc()
{
...
}
只写:
(*arrayToBeFilled) = new Type[length*rowSize];
然后只需std::vector<Type> arrayToBeFilled(length*rowSize);
。
(另请注意,return arrayToBeFilled;
可以嵌套在一起:您也可以使用vector
制作2D数组,但效率低于单vector<vector<Type>>
,其中更多直接映射到您的原始vector<Type>
电话。)
此外,在您发布的代码中,您使用new[]
在堆上创建一个原始C数组,并将指针指向new char[LONG_STRING_SIZE]
;然后使用inputString
中的赋值修改inputString
:但是这样做会泄漏其指针存储在pNext
中的初始数组。
答案 1 :(得分:1)
似乎你没有返回类型
template <class Type>
void myFunc(Type** arrayToBeFilled);
你应该初始化你的功能
double array = NULL;
myFunc<double>(&array);
当涉及到输入时,打印出你得到的值,通常情况下你可能会得到意想不到的错误。