双打和堆损坏的数组

时间:2012-05-28 08:22:43

标签: c++ arrays pointers memory-management

我有一个像

这样的功能
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";
    } 

这里有糟糕的输出 - 其他数字,有时堆腐败等等。我正在将它打印进出功能 - 结果相同。我不能删除这个数组没有或没有删除函数 - 运行时错误跟着我!

2 个答案:

答案 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);

当涉及到输入时,打印出你得到的值,通常情况下你可能会得到意想不到的错误。