【问题标题】:At the time of deallocation [duplicate]在解除分配时[重复]
【发布时间】:2018-11-13 10:23:23
【问题描述】:

我在这里进行动态内存分配。但问题是删除内存后,数据并没有从该块中删除。只有前两个块正在删除。 为什么?

 #include <iostream>
 #include <new>
 using namespace std;

int main ()
{
  int i,n;
  int * p;
  cout << "How many numbers would you like to type? ";
  cin >> i;
  p= new (nothrow) int[i];
  if (p == 0)
    cout << "Error: memory could not be allocated";
  else
  {
    for (n=0; n<i; n++)
    {
      cout << "Enter number: ";
      cin >> p[n];
    }
    cout << "You have entered: ";
    for (n=0; n<i; n++)
      cout <<"Value= "<< p[n] << ",Address = "<<&p[n]<<endl;
    delete p;
    cout<<endl<<"After Deallocation"<<endl;
  for (n=0; n<i; n++)
      cout <<"Value= " <<p[n] << ",Address = "<<&p[n]<<endl;
}
  return 0;
}

【问题讨论】:

  • 只有前两个块被删除 -- 你对“删除”的定义是什么?记忆不会消失在一股烟雾中。那些地方会留下一些残余物,你不能仅仅通过检查来确定这些残余物的含义。
  • 顺便说一句,删除数组,你应该调用delete[] p
  • 我也用过但是没用

标签: c++ memory dynamic new-operator allocation


【解决方案1】:

数据被释放,但这并不意味着数据值被改变了。

未指定如何更改数据。内存可能会在释放后一纳秒重新分配并完全改变。或者它可以保持不变,直到您的计算机停止。

【讨论】:

  • 有什么方法可以检查内存是否已被释放?或者如何检查 x 函数中使用了多少内存?
  • 不,无法检查它是否仍然分配或有效,它是 API 合同的一部分。那么如果你想知道一个函数使用了多少内存(这完全是另一个问题),那么你可以使用 massif 或 heaptrack。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多