Использование memcpy в конструкторе
От: alex2077  
Дата: 14.02.08 11:46
Оценка:
используя библиотеку gSOAP натолкнулся на грабли с генеренными ее средствами файлами, проблему можно свети к такому примеру:

struct my_str
{
    my_str() {}
    virtual ~my_str() {}
    
    char buf[100000];
};

void copy(my_str* to, const my_str* from)
{
    memcpy(to, from, sizeof(my_str));
}

class my_class : public my_str
{
public:
    my_class() {}

    my_class(const my_str& from)
    {
        //этот вызов корень всех бед 
        copy(this, &from);
    }        
   
    // вызов из функции другой виртуальной функции 
    // по сути вызов виртуальной функции изнутри класса
    virtual int f()
    {
        return x(rand());
    }
    
    virtual int x(int j)
    {
        return j*2;
    }
};

int main(int argc, char *argv[])
{
    my_class m1;
    
    //убедимся что все работает
    m1.f();
    
    my_str str;
    my_class m2(str);
   
    //вызов x из вне - все работает
    m2.x();

    // А вот тут core dump получаем на вызове my_class::x
    m2.f();
    
    return 0;
}



есть идеи как это объяснить?
P.S. если вызов copy перенести в конструктор копирывания my_str, то все работает замечательно!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.