Arduino C++ 析构函数?

3

我知道在Arduino中不能使用delete。那么C++类中定义的析构函数何时被调用?

同样地,如果我想创建一个指向数组的指针,我会需要使用mallocfree吗?


是的,mallocfree - user195488
1
似乎这里有两个问题:“在标准C++中析构函数何时被调用?”和“Arduino C++实现支持哪些情况?”但我认为Arduino并不使用C++(尽管硬件确实存在C++编译器,但Arduino不仅仅是硬件)。 - Ben Voigt
@BenVoigt,几年前我不得不在AVR平台上编写程序。这是该平台的g++端口,但实际上标准库缺少new和delete。我认为这是因为您可能希望使用自己的动态内存管理器,在低内存情况下更有效。 - Lol4t0
4
有趣。如果我可以将每个“new”替换为“malloc”和placement-new,并将“delete”替换为手动析构函数调用和“free”,那么在Arduino上使用“delete”有什么反对意见呢? - hamstergene
@Lol4t0:没错,如果这是AVR上的g++,它应该被称为那个,而不是“Arduino”。 - Ben Voigt
3个回答

2
析构函数在对象被销毁时调用。对于自动变量(在堆栈上),它会在离开其作用域({})后调用。了解更多关于自动变量的信息。

0

析构函数在变量超出作用域或被delete时调用。这意味着,如果您没有delete,则只能在自动内存中创建非POD结构。

不能使用mallocfree,因为构造函数和析构函数不会被调用

但是,您可以尝试像这样创建自己的newdelete

void* operator new(size_t size)
{
    void* mem = malloc(size);
    if (!mem) {
        throw std::bad_alloc();
    }
    return mem;
}

void operator delete(void* ptr)
{
    free(ptr);
}

void* operator new[] (size_t size)
{
    return (operator new)(size);
}

void operator delete[](void* ptr)
{
    return (operator delete)(ptr);
}

对象在直接调用析构函数时也会被销毁,但这种情况非常罕见,所以你没有提到它对我来说是可以接受的。Ardino听起来像一个奇怪的平台,你确定它能在上面运行吗? - Mooing Duck
@MooingDuck,Arduino只是带有饼干(一些IDE功能+ USB引导程序)的AVR平台。我相信,如果作者使用C ++,那么它实际上是AVRgcc端口。我在AVR上使用了这样的技巧来运行g ++,在发布之前进行了一些谷歌搜索,并发现在Arduino上也是可能的。 - Lol4t0
4
请勿在Arduino中使用throw语句,因为它不支持异常处理。 - Suma
确实,如果没有操作系统来维护应用程序,你想如何进行抛出? - Alexis Paques
3
throw 不需要操作系统支持。 - Lol4t0

0

抱歉,但在Arduino中,您可以使用new创建的任何内容都不能使用delete

当您删除时,会调用destructor

关于mallocfree也是如此。

class MyClass {
  private:
    char *_var;
  public:
    MyClass(int size) { // Constructor
      _var = (char *) malloc(sizeof(char) * size);
      ...
    }

  ~MyClass() { // Destructor
    free( _var );
  }
  ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接