开释堆内存失败delete [] p

释放堆内存失败delete [] p
有一道题目是这样的:
从标准设备读入的元素数据建立一个int 型vector对象,然后动态创建一个与该vector对象大小一致的数组,把vector对象的所有元素复制给新数组。
程序如下:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
//定义vector对象并通过键盘输入其值
vector<int> ivec;
int ival;
cout<<"输入整数,以Ctrl+Z结束"<<endl;
while(cin>>ival)
ivec.push_back(ival);
//创建动态数组
int *p=new int(ivec.size());
if(p==nullptr)
{
cout<<"No enough memory?!"<<endl;
return -1;
}
//将vector对象的值复制给动态数组
int *tp=p; //不要改变指向动态数组的指针p,以备在后面释放内存时使用
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++tp,++iter)
*tp=*iter;
cout<<"复制完成"<<endl;
//释放内存
delete [] p;
return 0;
}

编译时没有任何错误提示,但执行显示结果后,并没有出现“按任何键结束”字样,如下图:
开释堆内存失败delete [] p
经过调试,显示是在最后释放堆内存时错误,如下图:
开释堆内存失败delete [] p
对于这一点不明白,指点!!!
------解决思路----------------------
    int *p=new int(ivec.size()); //这里的小括号要改成中括号
------解决思路----------------------
int *p = new int(10);  // 给p分配一个int的空间,该int初始化为10,cout << *p 可以验证
int *p = new int(10);  // 给p分配10个int的空间

------解决思路----------------------
初始化失败开释堆内存失败delete [] p