0

我有一个像

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";
    } 

这里出现了糟糕的输出 - 其他数字,有时是堆损坏等等。我在函数内外打印它 - 结果相同。而且我不能删除这个数组,也不能删除这个函数——运行时错误跟着我!

4

2 回答 2

2

为什么在 C++ 中使用原始 C 数组?如果您使用STL 类std::vector不是 raw new[],您的代码将变得更干净,更易于阅读和维护(例如,您不需要显式delete[]调用:析构函数将清理堆内存)。一般来说,在现代 C++ 中,规则是“如果你正在编写 new 或 delete,那么你做错了”(有一些例外)。

另请注意,使用 C++11 移动语义,您可以简单地返回vector而不是使用输出引用/指针参数:

template <typename Type>
inline std::vector<Type> myFunc()
{
    ...
}

在你的函数体内,而不是你的代码

(*arrayToBeFilled) = new Type[length*rowSize];

写吧:

std::vector<Type> arrayToBeFilled(length*rowSize);

然后简单地说return arrayToBeFilled;

(还要注意vector' 可以嵌套在一起:您也可以vector<vector<Type>>用来制作 2D 数组,但这比单个 的效率低vector<Type>,后者更直接地映射到您的原始new[]调用。)

此外,在您发布的代码中,您在堆上创建了一个原始 C 数组,new char[LONG_STRING_SIZE]并将指向它的指针分配给inputString; 然后您inputString使用来自 : 的赋值进行修改,pNext但这样做会泄漏其指针存储在 中的初始数组inputString

于 2012-05-28T09:26:04.073 回答
1

似乎您没有返回类型

template <class Type>
void myFunc(Type** arrayToBeFilled);

你应该初始化你的函数

double array = NULL;
myFunc<double>(&array);

同样在输入时,打印出你得到的值,通常你可能会得到一些意想不到的东西,从而导致错误。

于 2012-05-28T08:53:18.373 回答