求助:解释下面代码中c++的指针问题

#include<iostream>
using namespace std;
main(){
int* t=new int[10];
delete (t+1);
system("pause");
}
//delete (t+1)发生了什么?
-----------------------------------------
#include<iostream>
using namespace std;
main(){
int* t1=new int;
int* t2=new(t1)int[10];
cout<<*(t2+3)<<endl;
cout<<t1<<endl<<t2<<endl;
delete[] t2;
system("pause");
}
//编译通过,运行时没有提示错误
//delete[] t2发生了什么?

这种情况建议你重载 operator new, new[], delete,delete[] 4个函数
然后打印信息看看(比如地址) 这样会比较直观.
C++中new 就是先调用operator new函数 然后里面调用malloc
delete 就是先调用operator delete函数 然后里面调用free.
来看看2个程序发生了什么:

1. delete(t+1)
new[] 时候除了malloc了 10个int, 还内部分配了4个byte来存放申请
的数组大小, 然后delete[] 时候根据这个大小来释放. 所以其实
malloc了11个int, t指向第2个开始的10个int, delete[] 会读取第一个
int来作为size.
一般情况下new[] 对象需要delete[] 但是内置类型比如int之类没有
构造函数的 这里直接delete t编译器会帮你优化没有问题.
但是 delete(t+1) 程序读取申请的个数时候出错(个数在第一个int.
但是现在读取了第2个int就是 t指向的int作为个数出错)
所以会出现
*** glibc detected *** ./a: free(): invalid pointer: 0x0804a00c ***

2. delete[] t2
t2 = new(t1)int[10]这里使用了 placement new
表示t2将使用以t1这个地址开头的内存块来开一个个数是10的int数组
所以t1和t2地址一样.
那么delete[] t2 语法是完全正确的

建议看看 More Effective C++ 和Inside C++ Object Model
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-02-21
1. t是一个整形指针,t+1就是下一个整形指针,也就是你new出来的第二个,一共你new了10个,delete(t+1),也就是只释放第二个。理论上来说,这个地方应该使用delete[] t。
2. 可能是我孤陋寡闻,我从来都没有见过int* t2 = new(t1)int[10];这种用法,但不过delete[] t2;这句可能会释放t1的内存,因为跟中的结果显示t2好像被强行赋值以t1,但不管如何,这种用法似乎是错的。
第2个回答  2009-02-21
delete (t+1) 释放了指针t的下一个内存空间,

delete[] t2 释放了t2所指的数组内存空间

delete 之前不会影响指针的读取也不影响程序,
该内存空间用完之后, 需归还, 待程序做其他用处
指针用完之后避免该指针影响该内存空间的值,还应将
指针值设为NULL.
第3个回答  2009-02-21
每new一次,系统会申请一个memory block header,并把申请到的内存的返回地址和这个memory block header绑定。delete时,根据地址查找相应的memory block header,再释放内存。delete (t+1)时系统找不到对应的的memory block header,不知道如何删除,会报错本回答被提问者采纳
第4个回答  2009-02-21
system函数在<cstdlib>中,你没有包括进来,编译错误。

main函数返回类型应该加上int。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网