delete []函数在C ++中无法正常工作

时间:2014-09-26 07:37:03

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

我有以下代码,但无法正常工作......

代码:

#include <iostream>
#include <new>
#define nullptr NULL
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 == nullptr)
    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 << p[n] << ", ";
    delete[] p;
    for (n=0; n<i; n++)
      cout <<"a "<< p[n] << endl;
  }
  return 0;
}

当我打印delete[] p;的值时使用p语句后,所有元素都会生成垃圾值,因为先前分配的内存已被释放...但是,它只为前2个元素生成垃圾值其余元素打印分配给它的值...这意味着未释放总分配内存......

  • 为什么会这样?
  • 如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

程序具有未定义的行为,只有具有分配数组的内存范围的内存页面不会被操作系统丢弃或被其他数据覆盖。

没有什么可以解决的。您根本无法访问此内存。如果您的程序在删除后尝试访问该数组,则表示该程序存在错误。要找到错误,可以将指针设置为NULL。例如

delete[] p;
p = nullptr;

答案 1 :(得分:1)

没有必要意味着内存不是免费的。从地址p开始的内存是免费的,但可能仍有部分先前写入的数据。如果您希望这些值不同,只需在删除已分配的内存之前更改它们