在动态数组c ++中检测到堆损坏?

时间:2015-07-15 19:57:48

标签: c++

我正在学习如何对动态数组使用delete运算符,我遇到了一些非常奇怪的问题。我尝试了两种方法来编写相同的代码 - 一种工作,但另一种工作。所以,这是我试过的代码

方法1: -

#include <iostream>
using namespace std;

int main()
{

  int *p = new int(2);

   for(int i =0; i<2;i++)
   {
       cin>>p[i];

   }

   for(int i=0; i<2;i++)
   {
       cout<<p[i];

   }

      delete[] p;

     system("pause");
}

//错误消息 - 检测到堆损坏。有人可以解释一下错误的原因吗?

方法2: - 使用TypeDef

#include <iostream>
using namespace std;

typedef int arr[2];

int main()
{

  int *p = new arr;

   for(int i =0; i<2;i++)
   {
       cin>>p[i];

   }

   for(int i=0; i<2;i++)
   {
       cout<<p[i];

   }

      delete[] p;

     system("pause");
}

//上述方法完美无误。我完全糊涂了!!

4 个答案:

答案 0 :(得分:2)

第一种情况:您只创建一个int并为其赋值2.

然后将其视为包含两个元素的数组。这是未定义的行为。你需要使用new int [2]。你的delete []语法是正确的。

你的第二个例子太混淆了。

答案 1 :(得分:2)

您正在调用 one int的构造函数,其值为2而非分配 两个整数。< / p>

改用方括号。

int *p = new int[ 2 ];

答案 2 :(得分:2)

new int(2)分配值<{1}}的一个 int

2分配一个两个 new int[2]的数组,其中包含不确定的值。

答案 3 :(得分:0)

在你的第一个例子中:

int *p = new int(2);

正在初始化指向值2的1指针,而不是在你有

时在第二个例子中
new int[2];

你实际上是在做两个指针。