我正在学习如何对动态数组使用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");
}
//上述方法完美无误。我完全糊涂了!!
答案 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];
你实际上是在做两个指针。