我目前正在关注Springer的一本书《C++中的科学计算指南》,其中有一个关于指针的练习是这样说的。
"写一段代码,动态分配内存给两个长度为3的双倍向量,给每个条目赋值,然后取消分配内存"。扩展这段代码,使它能计算这些向量的标量乘积,并在去分配内存之前将其打印到屏幕上。把内存的分配、计算和去分配内存放在一个for循环里面,这个循环要运行1,000,000,000次:如果内存没有正确去分配,你的代码就会使用所有可用资源,你的计算机可能会很吃力。"
我的尝试是。
for (long int j = 0; j < 1000000000; j++) {
// Allocate memory for the variables
int length = 3;
double *pVector1;
double *pVector2;
double *scalarProduct;
pVector1 = new double[length];
pVector2 = new double[length];
scalarProduct = new double[length];
for (i = 0; i < length; i++) { // loop to give values to the variables
pVector1[i] = (double) i + 1;
pVector2[i] = pVector1[i] - 1;
scalarProduct[i] = pVector1[i] * pVector2[i];
std::cout << scalarProduct[i] << " " << std::flush; // print scalar product
}
std::cout << std::endl;
// deallocate memory
delete[] pVector1;
delete[] pVector2;
delete[] scalarProduct;
}
我的问题是,这段代码可以运行,但效率低下。似乎内存的去分配应该快得多,因为它运行了一分钟以上才终止。我假设是我误用了去分配,但没有找到合适的方法来解决。
你的代码完全做到了它应该做到的,运行很长时间而不会因为out_of_memory而使电脑崩溃。这本书可能有点过时了,因为它假设你在崩溃之前不能分配超过72.000.000.000字节的内存。你可以测试一下,删除因此泄漏的内存。