在栈上new的话, 怎么会有这样的问题? 请看代码。
#include <iostream>
using namespace std;
int main(){
char place[8];
int * pint;
pint = new (place) int[2];
for( int i = 0; i < 2; i++){
cout<<(*pint)<<endl;
}
delete [] pint;
return 0;
}
use operator new on heap, then delete, it is OK. what is the difference between the two method? I guess , there is a mark at the end of the memory allocated by new on heap.
waiting for solution.....
问题点数:0、回复次数:11Top
1 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 07:22:19 得分 0
想骂娘。。。居然在栈上用 placement new,还 delete ,我晕Top
2 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 07:58:23 得分 0
突然想明白了:new 分配的内存由 delete 来清理。看看 VC 的 placement new 的实现:
inline void *__cdecl operator new[](size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
只是直接提交传入的指针,所以根本没有分配内存,用 delete[] 清理当然不对了,哈哈
inline void __cdecl operator delete[](void *, void *) _THROW0()
{ // delete if placement array new fails
}
这个是跟你的 placement array new 相对应的 placement delete,但是不知道怎么使用。呵呵,谁知道的提醒一下。
我怀疑的是:因为 placement new 没有分配内存,所以根本不需要 placement deleteTop
3 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 08:05:14 得分 0
这下对了:一个 placement arr new 对应一个 placement arr delete
特点: placement * delete 必须是 explicit called.
int main(){
char place[8];
int * pint;
pint = new (place) int[2];
for( int i = 0; i < 2; i++){
cout<<(*pint)<<endl;
}
::operator delete [] (place, pint);
return 0;
}
参考资料:
http://216.239.57.104/search?q=cache:GOmbJKynNngJ:anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1995/N0642.pdf+placement+delete&hl=zh-CN&ie=UTF-8Top
4 楼Wendydd(温迪)回复于 2003-11-03 10:12:00 得分 0
值得研究!
收藏先
:)Top
5 楼xiaoyunet(快乐的小猪)回复于 2003-11-03 10:39:00 得分 0
不要调用delete操作符,他会试图去释放内存。这会引起程序崩溃。
注意:调用placement new在这里只是执行了构造函数。
也就是说我们只要先是调用析构函数就可以了,不必去释放内存。
不过不鼓励搂住这种做法,在栈上的内存不要用在placement new上。这简直是罪过。
Top
6 楼sham2k(sham2k)回复于 2003-11-03 12:49:56 得分 0
玩这些技巧有意义吗?Top
7 楼jeckyz(深圳)回复于 2003-11-03 13:36:02 得分 0
我同意 Wolf0403(完美废人)兄 的解释 :) 在一个已知的地址上进行 placement new ,编译器一般只实施对象初始化(也就是调用相应的构造函数).
言下之意就是,如果那个已知的内存块是动态分配的,那么就终销毁的也应该是这块内存,在此之前应该显式地调用所创建对象的释构函数(C++需要显式调用释构函数的情形之一); 如果是一个 local variable (在栈上), 那么为了安全起见,就只需要显式调用释构函数就行了,因为栈变量的内存是由编译器根据不同的调用策略来处理/释放的.
有没有这样使用的必要,我也说不上来,或许哪一天真的有了.呵呵, 献丑至此, 有不恰当之处,请不吝指教!
Top
8 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 13:57:33 得分 0
看看我提供的代码就知道,placement new 对应的 placement delete 除了调用析构函数,不执行内存操作。所以,出于良好编程习惯的考虑,调用 placement delete 还是应该的。
“在栈上的内存不要用在placement new上。这简直是罪过。”
精彩。Top
9 楼liao2001(知之为知之,不知为不知。。。)回复于 2003-11-03 14:05:33 得分 0
呵呵,这就是c++程序员们Top
10 楼jazzny(寒风)回复于 2003-11-03 14:51:32 得分 0
hehe, 我也只是想试试玩而已拉, 不过用new在heap上申请内存, 在这块内存的结尾处, 是不是有个表示结束的系统标记了?
望高人详细解释一下Top
11 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-10 00:46:11 得分 0
呵呵,compiler magic 啦,谁知道呢。
所以我建议用 placement delete 来清理一下,不管什么 magic 都给我收场去,呵呵。Top




