gpt4 book ai didi

c++ - double 组和堆损坏

转载 作者:行者123 更新时间:2023-11-28 00:56:45 24 4
gpt4 key购买 nike

我有一个类似的功能

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

我这样调用它:

double* array = NULL;
myFunc(&array);

在函数内部,我使用 strtod 函数读取和解析数字:

//这里是打开文件,获取行数和每行的double数

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

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

最佳答案

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

另请注意,使用 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>> 来制作二维数组,但这比单个 vector<Type> 效率低,后者更直接映射到您的原始 new[] 调用。)

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

关于c++ - double 组和堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10781481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com