реклама на сайте
подробности

 
 
> C++ в IAR, проблемы с оператором new
A_Sherbakov
сообщение Sep 26 2014, 09:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 16-05-12
Пользователь №: 71 870



Здравствуйте, у меня возникла проблема. Хочу при разработке использовать все прелести С++, но при первом же динамическом создании объекта натолкнулся на проблему.

Код
class eArp:eMac{
public:
    struct t_ARPlayer{
        u16 Hard;
        u16 Prot;
        u8 HA_Len;
        u8 PA_Len;
        u16 Code;
        u8 MACSrc[6];
        u8 IPSrc[4];
        u8 MACDest[6];
        u8 IPDest[4];
    };t_ARPlayer * ArpLayer;
    u16 fg;
    eArp(u8 * data):eMac(data){
        this->ArpLayer = (t_ARPlayer*)data+14;
        this->fg = 16;
    }
};

вот так все хорошо:

Код
eArp arp2((u8 *)EnetDmaRx[Index].pBuffer);


а вот так все плохо:

Код
eArp * arp1 = new eArp((u8 *)EnetDmaRx[Index].pBuffer);


когда программа доходит до конструктора в data адрес нормальный, и после прохождения строчки
this->ArpLayer = (t_ARPlayer*)data+14;
адрес this->ArpLayer равен 0

аналогично с полем fg, должно становиться 16. а равно нулю.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WitFed
сообщение Oct 15 2014, 08:23
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



Я бы ещё попробовал вынести определение типа "struct t_ARPlayer{" в более внешнюю область.
Хотя С++-компиляторы и должны поддерживать все современные извраты типа заключения определений типа в структуру и юзанья оттудова в шаблоне, зависящем от этой структуры, хорошо это сделают совсем немногие, а другие могут и треснуть внутри.
"(t_ARPlayer*)data+14", конечно, лучше изложить в редакции "(t_ARPlayer*)(data+14)" -- вряд ли подразумевается 14-я структура.

Ещё есть вариант с подменой оператора new на более свой -- мне наш Плюсолюб подсказал. Вдруг проканает через malloc() взятый кусок.
Память под объект может быть выделена любым методом, только нужно сварганить свои операторы new/delete (placement new) и вызывать их с дополнительным параметром (а обычный new останется -- просто так, без доп-параметра):
Код
void * operator new(size_t, void *ptr) {return ptr;}
void operator delete(void *, void * ptr) {}
eArp *p = (eArp*) malloc(sizeof(eArp));
new (p) eArp(buf);  // call constructor with ready memory
(*p).~eArp(); // call destructor without delete()
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016