typedef int Arr[N]; void*p = new Arr;如何释放内存?

luuillu 2011-07-22 12:06:24
#define N 100

typedef int Arr[N];

void *p=new Arr;


释放p所指的内存应该用 delete 还是 delete[] ?
...全文
285 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
z8323664 2011-08-02
  • 打赏
  • 举报
回复
看看!!!!
tmp_gogoto 2011-08-02
  • 打赏
  • 举报
回复
typedef int Arr[100];

Arr *p = new Arr;

delet p;
----------------------------------
这种写法本来就不对吧,
首先,Arr[100] 是 int 的别名,单独的 Arr 什么都不是呀。
Arr 不是类型呀?

所以
Arr *p=new Arr;
本来就是不成立的。

ljhhh0123 2011-07-29
  • 打赏
  • 举报
回复
当然不带[],因为你new的时候就没带[]
typedef int Arr[100];

Arr *p = new Arr;

delet p;


wjjjuniniho 2011-07-29
  • 打赏
  • 举报
回复
本质还是primitive type,所以还是delete
xiaohuh421 2011-07-23
  • 打赏
  • 举报
回复
如果你的数组是<<基本数据类型>>,比如int,double等等,那么有[]有没有是相同的
如果<<不是基本数据类型>>,比如结构体和类,那么你就一定要加[]告诉它是一个数组了.
luuillu 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 luuillu 的回复:]
测试发现 Arr* p=new Arr;编译通不过,编译错误为:
[/Quote]
此处修改一下。
luuillu 2011-07-23
  • 打赏
  • 举报
回复
感谢楼上各位的热心回复。
现在公布一下我自己实验结果。所用编译器为vs2008 。

typedef int Arr[5];
测试发现 Arr* new Arr;编译通不过,编译错误为:
error C2440:“初始化”:无法从“int*” 转换为“Arr(*)” .
由此可见new运算符没有把Arr当成一个新类型,仍然按数组处理的。

对于void*p =new Arr; 测试发现用delete和delete[]都释放了全部内存。

然后我又用自己定义的类型实验,发现了一些特殊情况

定义新类型A,并且typedef A Arr[5];

struct A
{
A()
{
cout<<"A created."<<end;
}
~A()
{
cout<<"A destructed."<<endl;
}
int val;
};

typedef A Arr[5];



测试1

A *p = new Arr;
delete [] p;

//测试结果:5次构造,5次析构,程序正常结束。


测试2 (不加[])

A *p = new Arr;
delete p;

//测试结果:构造5次,析构1次,接着系统响了一声警告,程序不能结束。


测试3. 用void*测试。

A *p = new Arr;
void *q=p
delete[] q;

//测试结果:构造5次,析构0次,接着系统响了一声警告,程序不能结束。
//那么是不是因为 变量由 A* 转为 void*后值改变了呢?不是的,测试发现p与q的值相等。


测试4 ( 不加[] )

void *p = new Arr;
delete p;

//测试结果:与测试3相同。


threeleafzerg007 2011-07-22
  • 打赏
  • 举报
回复
按标准应该是

delete []

effective c++ 有讲的
机智的呆呆 2011-07-22
  • 打赏
  • 举报
回复
Arr 是数组类型,
所以用delete[]释放。
pengzhixi 2011-07-22
  • 打赏
  • 举报
回复
delete[]
jernymy 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 llxxhm 的回复:]
按标准来:
C/C++ code

delete p;
[/Quote]
推荐
QQ515311445 2011-07-22
  • 打赏
  • 举报
回复
按标准来:

delete p;
ryfdizuo 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 luuillu 的回复:]
#define N 100

typedef int Arr[N];

void *p=new Arr;


释放p所指的内存应该用 delete 还是 delete[] ?
[/Quote]
严格说应该是delete p;
Arr是自定义的类型,new Arr 申请了一个指向数组的指针。
zyc_glboy 2011-07-22
  • 打赏
  • 举报
回复
好像都行
zyc_glboy 2011-07-22
  • 打赏
  • 举报
回复
delete []
恨天低 2011-07-22
  • 打赏
  • 举报
回复
delete
wangyangkobe 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 luuillu 的回复:]
#define N 100

typedef int Arr[N];

void *p=new Arr;


释放p所指的内存应该用 delete 还是 delete[] ?
[/Quote]



class A
{
public:
A()
{}
~A()
{
cout<<"destory"<<endl;
}
};
int main(int argc, char *argv[])
{
typedef A Arr[2];
A *p = new Arr;
delete[] p;
system("PAUSE");
return EXIT_SUCCESS;
}


由此可见需要使用delete [], 否则会内存泄漏!
序员 2011-07-22
  • 打赏
  • 举报
回复
why don't you just use
Arr* p = new Arr;
and
delete p;
至善者善之敌 2011-07-22
  • 打赏
  • 举报
回复
带码真怪异,应该是delete []
Saingel 2011-07-22
  • 打赏
  • 举报
回复
连续内存释放两者都可以
加载更多回复(3)

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧