2013-09-12 5 views
0

Эта проблема также появляется в обычном C++-коде, но это не проблема, потому что в обычном C++ я могу использовать «новый» вместо «malloc».Использование наследования классов и malloc (на arduino)

Что я хочу сделать, это связанный список объектов, которые имеют один и тот же интерфейс, но разные функции и переменные-члены, и надеялись сделать это с помощью членов виртуального класса.

Но я получаю ошибку сегментации. Я сделал следующий простой пример кода (на основе this), первый в Arduino C++:

class CPolygon { 
    protected: 
    int width, height; 
    public: 
    void set_values (int a, int b) 
     { width=a; height=b; } 
    virtual int area (void) =0; 
    void printarea (void) 
     { Serial.println(this->area()); } 
    }; 

class CRectangle: public CPolygon { 
    public: 
    int area (void) 
     { return (width * height); } 
    }; 


void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
} 

void loop() { 
    CRectangle rect; 
    CPolygon * ppoly1 = ▭ 
    ppoly1->set_values (4,5); 
    ppoly1->printarea(); 
    delay(1000); 
} 

Я также сделал это в обычном C++, в надежде найти ошибку (она просто дает мне ошибку сегментации):

#include <iostream> 
#include <stdlib.h> 
using namespace std; 

class CPolygon { 
    protected: 
    int width, height; 
    public: 
    void set_values (int a, int b) 
     { width=a; height=b; } 
    virtual int area (void) =0; 
    void printarea (void) 
     { cout << this->area() << endl; } 
    }; 

class CRectangle: public CPolygon { 
    public: 
    int area (void) 
     { return (width * height); } 
    }; 


int main() { 
    CRectangle * rect; 
    rect = (CRectangle*) malloc(sizeof(CRectangle)); 
    * rect = CRectangle(); 
    CPolygon * ppoly1 = rect; 
    ppoly1->set_values (4,5); 
    ppoly1->printarea(); 
    return 0; 
} 

Как я уже сказал, я попытался это с использованием новых:

int main() { 
    CRectangle * rect; 
    rect = new CRectangle; 
    CPolygon * ppoly1 = rect; 
    ppoly1->set_values (4,5); 
    ppoly1->printarea(); 
    return 0; 
} 

и работает отлично.

Я не совсем уверен, куда идти отсюда в процессе отладки. Я что-то делаю неправильно, или это неотъемлемое ограничение malloc() и, следовательно, arv-g ++?

+0

Что именно вы имеете в виду с _'normal C++ '_ ?? Если у вас есть компилятор C++, и у вас есть реализация stdlib, которая поддерживает 'malloc()', 'new' должна работать отлично в коде C++. Что произойдет, если вы используете 'new' с вашей аркойной перекрестной цепью? –

+0

'malloc()' никогда не будет работать для этого BTW, потому что помимо выделения памяти вам нужны правильно построенные (инициализированные) экземпляры классов. –

+0

Я программирую для arduino, поэтому мне нужно использовать компилятор arv-g ++.Я где-то читал, что этот компилятор не поддерживает новые и удаляет, только malloc и связанные с ним функции, поэтому я никогда не думал попробовать. По-видимому, ребята из arduino добавили поддержку в свои библиотеки, и я никогда не думал попробовать ... –

ответ

3

Чтобы использовать пространство, которое зарезервировано с таНос, вы можете сделать следующее:

new(rect) CRectangle(); 

вместо

* rect = CRectangle(); 

Когда я нахожу ссылки, которые используют этот синтаксис, я буду писать это здесь.

1

Я согласен с версией на C++ с новыми работами. Это связано с тем, что новый выделяет память для экземпляра класса, а затем вызывает конструктор (ы). malloc не делает, что он просто выделяет память, и поэтому класс никогда не формируется должным образом, поэтому сбой версии malloc. Всегда используйте новые и удаляйте для классов.

0

Я не совсем уверен, куда идти отсюда в процессе отладки. Я что-то делаю неправильно, или это неотъемлемое ограничение malloc() и, следовательно, arv-g ++?

Да, это ограничение присуще malloc() (это C не C++ BTW). Чтобы создать экземпляр объектов класса C++, необходимо, чтобы один из их методов-конструкторов вызывался для правильной инициализации выделенной памяти, которую malloc() не обслуживает.

У меня нет опыта с ардуино, но если ОС поддерживает malloc() уже для распределения динамической памяти, то необходимо также поддерживать new. По крайней мере, вы можете использовать синтаксис «размещение нового», предложенный Мартином Лавуа (см. Также here).

+0

новые и удаленные [не поддерживаются avr-libc.] (Http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus) – Craig

Смежные вопросы