现在碰到这么个问题:我定义了个类,比如:
class CTest
{
public:
  CTest();
  ~CTest();
public:
  CString s; 
}我现在不使用new来构造,而是使用类似于:
CTest* test = (CTest*)malloc(sizeof(CTest));
这样CTest的构造函数与CString的构造函数都无法调用
test->CTest();//提示是错误的。
test->s.CString();//提示是错误的
由于没有执行构造函数,所以在执行 test->s = "hello"; 的时候会报错!该怎么解决这个问题呢??

解决方案 »

  1.   

    CTest test;
    不好吗?
      

  2.   

    除非用实例,malloc不会调用构造函数的。
      

  3.   

    我前几天作OLE剪切板,也碰到了这个问题。我用的是::GlobalAlloc();我做后分配了一个大字符数组,char a[1024]...我也想知道还有什么好方法吗?
      

  4.   

    CTest test();这样就能调用构造函数了
      

  5.   

    我想得去看看new的实现,他是怎么去调构造的??
      

  6.   

    再调用这个成员!
    比如:
    void Init()
    {
    ...
    }
      

  7.   

    同意 phourm。eg:
    class CTest
    {
    public:
     CTest()
     { 
       init();
     } void init(){}}CTest* test = (CTest*)malloc(sizeof(CTest));test->init();
      

  8.   

    用placement new
    void* test = (void*)malloc(sizeof(CTest));
    new(test) CTest();
      

  9.   

    我说明一下我问这个问题的用意,我现在在做一个服务器端的程序,有一个Class类数据需要动态创建,同时节点数可能很大 我想用VirtualAlloc在虚拟内存中创建,不想使用new。所以才会有这个问题。这个Class中有很多其他CLASS的对象成员。
    to  liu_feng_fly(笑看风云 搏击苍穹 衔日月) :
      谢谢,placement new 怎么在VC中无法编译通过??to phourm , newbibe(抵制日货) :
      谢谢!不过在我的CTest中果引用了别人的类例如:CString时候,我就得去一个个找他们的初始化函数,例如CString的初始化函数是:init(),这种情况下比较麻烦,不过没有其他办法的时候也只能这样了。
      

  10.   

    #include<new>void* test = (void*)malloc(sizeof(CTest));
    new(test) CTest();
      

  11.   

    TO genvy(Paul) : 好象编译不过去啊::\MFC_TEST\MFC_TESTDlg.cpp(178) : error C2061: syntax error : identifier 'test'
    E:\MFC_TEST\MFC_TESTDlg.cpp(181) : error C2143: syntax error : missing ';' before '}'
      

  12.   

    不知道怎么回事情,在控制台程序下编译是正常的,但在MFC DIALOG下却无法编译
      

  13.   

    把某些初始化单独做到一个Init里面,别做到构造里面
      

  14.   

    《精通MFC》里1.3.2.2部分的构造不错。
      

  15.   

    可以重载oprator new,这样:
    class CTest
    {
    public:
      CTest();
      CTest(int i);
      ~CTest();
      
       void* operator new(size_t,void* buf){return buf;}
    public:
      CString s; 
    }char* lpbuf = (char*)malloc(sizeof(CTest));
    CTest* test = new(lpbuf) CTest;new仅返回malloc分配的内存首址,
    这样既调用了构造函数,又把对象放置到了你malloc的那块内存,而且你还可以调用复制构造函数,即:CTest* test = new(lpbuf) CTest(1);不过释放对象时不能用delete,因为内存是malloc的,所以必须显式调用析构函数:
    test->CTest::~CTest();
      

  16.   

    对象无非就是存在于stack内存和heap内存,如果你要在heap内分配对象,就得使用new或者是静态对象,new操作符他有两个基本的方面:1,首先分配sizeof(yourObject)的内存,2,然后在这块内存上调用ctor进行对象的初始化.如果你是使用stack内存的话,直接定义一个类对象就可以了,用不着new操作符,也照样调用ctor.
    像你这种情况,我觉的你可以使用内存池策略可以解决的.
      

  17.   

    谢谢大家的意见,看样子placement new的确是最好的选择了!!接帖子了!!