我在 c++ 代码中遇到了内存问题,当然我错了,但我没有得到这个问题。我已经声明了一个由三个指针组成的数组来加倍和分配内存。
double *myDoubles[3];
for(int i=0;i<3;i++) {
myDoubles[i]= (double *) malloc(1000*sizeof(double));
}
myDoubles[2][999]=10.55;
怎么了?
编辑
正如@EdHeal评论和@PhilippKiener我根本不应该使用 malloc。但是在25年之前很难忘记malloc。 毕竟,我的问题是另一个地方的另一个错误,实际上我写的:)超出了限制。我的错!
每次分配 1000 个字节,而不是 1000 个双精度。 你应该做的是:
malloc(1000 * sizeof(double));
完整的代码应如下所示:
double* myDoubles[3];
for(int i = 0; i < 3; i++) {
myDoubles[i] = (double*) malloc(1000 * sizeof(double));
}
myDoubles[2][999] = 10.55;
首先要做的是:不要在返回malloc
投递指针。void*
(在您的情况下)double*
是隐式的(也是预期的),但显式强制转换通常被认为是不好的做法。
现在谈谈你的问题;malloc
分配给定数量的字节,并返回指向这些字节的指针。您分配了 1000 个字节,但您想要的是分配足够的字节来执行 1000double
秒。出错的原因是double
大于单个字节 - 它是 8 个字节。您可以使用sizeof(type)
获取类型的大小;因此,要为 1000double
秒分配足够的内存,您必须将循环内的行更改为:
myDoubles[i] = malloc(1000 * sizeof(double));
要了解系统上类型的大小,您可以
printf("Size of double: %d", sizeof(double));
在您的代码中。
编辑:
现在,由于您正在使用C++,因此根本不应该使用malloc
。C++让生活更轻松,给你new
!
分配行应为
myDoubles[i] = new double[1000];
新的好处是它不需要提供的尺寸......你给它一个类型和数量;它会计算您需要的字节数。但要注意,而不是free
你应该使用
delete[] myDoubles[i];
当您使用C++时,请使用std::vector
- 看这里
所以代码变成了
std::vector<std::vector<double>> myDoubles(3);
myDoubles[2].resize(1000);
myDoubles[2][999] = 10.55;
也许您需要调整其他条目的大小 - 我把这个练习留给你。
此外,您不必担心内存泄漏。