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

来源:百度知道 编辑:UC知道 时间:2024/06/04 01:04:40
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 * )这个两个运算符。不过,如果我写一个容器,那它就得要求它的元素必须重载这两个函数,用起来很不方便。

这个问题,我自己已经解决了。呵呵,因此,要关闭问题了。

使用placement new
如下:
char* buffer = ( char * ) VirtualAlloc ( NULL, sizeof( MyClass ), MEM_COMMIT | MEM_RESEVE, PAGE_READWRITE );

MyClass*p = new (buffer) MyClass;

这样就行了,在win32下这样使用没问题
在MFC下如果debug模式会出错(release没问题),因为 .cpp文件的首部有:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
将new操作符重新定义了,注释掉即可。

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;

这是一种解决办法吧,但我感觉怪怪的,不太喜欢。算是一种法子吧,贴上来看看。(用局部变量不太好,因为局部变量自己无法自主释放,必须要等到退出该代码块才能释放。如果用局部变量的话,可以考虑用花括号括起来,以便使局部变量尽早被释放)