虚拟内存的问题,望高手解答一下。

[复制链接]
查看11 | 回复2 | 2009-3-2 21:40:26 | 显示全部楼层 |阅读模式
MyClass * p = ( MyClass * ) VirtualAlloc ( NULL, sizeof( MyClass ), MEM_COMMIT | MEM_RESEVER, PAGE_READWRITE );
这样的调用,不会调用 MyClass的构造函数,请问如何解决??
---------------------------------------------
首先感谢两位的回答。
不过,silvergingko 的回答是错误的。copyMemory只是复制内存块,对于VritualAlloc新开辟的那个新的MyClass对象仍然没有调用构造函数。如果MyClass类中有动态内存分配操作的话,仍然会出现错误。
stone_dongdong 的回答是正确的,重载了MyClass对象的new operator后的确会调用构造函数,但是这要求MyClass必须重载new operator( size_t, void * )和 delete ( void *, void * )这个两个运算符。不过,如果我写一个容器,那它就得要求它的元素必须重载这两个函数,用起来很不方便。
这个问题,我自己已经解决了。呵呵,因此,要关闭问题了。

回复

使用道具 举报

千问 | 2009-3-2 21:40:26 | 显示全部楼层
MyClass* pNew = new MyClass(x);MyClass* pVirAllc = ( MyClass*)VirtualAlloc(NULL, sizeof(MyClass), MEM_COMMIT | MEM_RESEVER, PAGE_READWRITE); CopyMemory((PVOID)pVirAllc, (PCVOID)pNew, sizeof(MyClass));delete pNew;这是一种解决办法吧,但我感觉怪怪的,不太喜欢。算是一种法子吧,贴上来看看。(用局部变量不太好,因为局部变量自己无法自主释放,必须要等到退出该代码块才能释放。如果用局部变量的话,可以考虑用花括号括起来,以便使局部变量尽...
回复

使用道具 举报

千问 | 2009-3-2 21:40:26 | 显示全部楼层
使用placement new如下:char* buffer = ( char * ) VirtualAlloc ( NULL, sizeof( MyClass ), MEM_COMMIT | MEM_RESEVE, PAGE_READWRITE );MyClass*p = new (buffer) MyClass;这样就行了,在wi...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行