0

这个问题也出现在普通的 C++ 代码中,但这不是问题,因为在普通的 C++ 中我可以使用“new”而不是“malloc”。

我想要做的是创建一个具有相同接口但功能和成员变量不同的对象的链接列表,并希望使用虚拟类的成员来做到这一点。

但是我遇到了分段错误。我首先在 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;
}

就像我说的,我用 new 试过这个:

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

这很好用。

在调试过程中,我不确定从哪里开始。我做错了什么,还是这是 malloc() 的固有限制,因此也是 arv-g++ 的限制?

4

3 回答 3

3

要使用您通过 malloc 保留的空间,您可以执行以下操作:

new(rect) CRectangle();

代替

* rect = CRectangle();

当我找到使用该语法的参考资料时,我会在这里写下来。

于 2013-09-12T21:31:26.693 回答
1

我同意 C++ 版本的新作品很好。那是因为 new 为类的实例分配内存,然后调用构造函数。malloc 不会这样做,它只是分配内存,因此该类永远不会正确形成,这就是 malloc 版本崩溃的原因。始终对类使用 new 和 delete。

于 2013-09-12T21:19:46.880 回答
0

在调试过程中,我不确定从哪里开始。我做错了什么,还是这是 malloc() 的固有限制,因此也是 arv-g++ 的限制?

是的,这个限制是固有的malloc()(这是 C 而不是 C++ BTW)。要实例化 C++ 类对象,有必要调用它们的构造函数之一来正确初始化分配的内存,但这malloc()不起作用。

我对arduino没有经验,但如果操作系统malloc()已经支持动态内存分配,new也应该支持。至少您可以使用 Martin Lavoie 建议的“新放置”语法(另请参见此处)。

于 2013-09-12T21:43:40.220 回答