【发布时间】:2012-05-28 08:22:43
【问题描述】:
我有一个类似的功能
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";
}
这里出现了错误的输出 - 其他数字,有时是堆损坏等等。我在函数内外打印它 - 结果相同。而且我不能删除这个数组 no 或没有函数 - 运行时错误跟随我!
【问题讨论】:
-
您发布的代码看起来不错 - 问题可能出在您尚未发布的代码中。你能发布一个产生错误的完整示例吗?
-
不应该是 i*length (因为你正在迭代长度)+ j?
-
@KamilKlimek:不。将
i视为要跳过以到达当前行开头的行数。因此要跳过的元素的数量是i*rowSize。 -
请注意,您使用
new char[LONG_STRING_SIZE]在堆上创建一个原始C 数组,并将指向它的指针分配给inputString;然后你用来自pNext的赋值修改inputString:那么,你泄漏inputString初始数组了吗? -
@Mr_C64 是的,你是对的!解决了一个问题。
标签: c++ arrays pointers memory-management