假设我有以下片段。
int main()
{
int num;
int* cost;
while(cin >> num)
{
int sum = 0;
if (num == 0)
break;
// Dynamically allocate the array and set to all zeros
cost = new int [num];
memset(cost, 0, num);
for (int i = 0; i < num; i++)
{
cin >> cost[i];
sum += cost[i];
}
cout << sum/num;
}
` `delete[] cost;
return 0;
}虽然我可以将delete语句移动到while循环中,但为了理解起见,我想知道编写代码时会发生什么。每次使用运算符new时,new是否分配不同的内存空间?
操作符delete是否只删除最后分配的cost数组?
发布于 2015-05-20 14:13:52
每次使用运算符
new时,C++是否分配不同的内存空间?
是。
操作符
delete是否只删除最后分配的cost数组?
是。
你失去了给其他人的唯一指示,所以它们被不可挽回地泄露了。为了避免这个问题,不要篡改指针,而是使用RAII自动管理动态资源。在这里,std::vector将是完美的(如果您确实需要一个数组;您的示例可以继续读取和重用单个int)。
发布于 2015-05-20 14:50:08
我强烈建议您不要在C++程序中使用"C成语“。让std库为您工作:这就是它存在的原因。如果你想要“n个整数的数组(向量)”,那么这就是std::vector的全部内容,它“包括电池”。你不需要在“设置最大尺寸”或“将其设置为零”之类的事情上胡作非为。你只是和“这件事”一起工作,它的内在运作你不需要.关心,知道它已经被彻底设计和测试。
此外,当您这样做时,您是在C++现有的内存管理框架内工作,特别是在您自己的应用程序中,您没有做任何标准库所不知道的“带外”的操作,并且可能会(!!)使用它。
C++为您提供了一个非常全面的库,它包含快速、高效、健壮、测试良好的功能。利用它。
发布于 2015-05-20 14:23:57
代码中没有cost数组。在您的代码中,cost是指针,而不是数组。
代码中的实际数组是通过重复的new int [num]调用创建的。每次对new的调用都会创建一个新的、独立的、无名的数组对象,该对象位于动态内存中的某个地方。新数组一旦由new[]创建,就可以通过cost指针访问。因为数组是匿名的,所以cost指针是您唯一的链接,它将导致由new[]创建的无名数组。您没有其他方法访问该无名数组。
每次在循环中执行cost = new int [num]时,您都要创建一个全新的、不同的数组,断开从cost到前一个数组的链接,并使cost指向新的数组。
由于cost是您与旧数组的唯一链接,因此该旧数组将变得不可访问。对旧数组的访问将永远丢失。它变成了一个内存泄漏。
正如您自己正确描述的那样,您的delete[]表达式只释放最后一个数组-- cost最终指向的数组。当然,只有当代码执行cost = new int [num]行时,这才是正确的。请注意,您的循环可能在不执行单个分配的情况下终止,在这种情况下,您将将delete[]应用于未初始化的(垃圾)指针。
https://stackoverflow.com/questions/30352206
复制相似问题