You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino环境下不使用std::vector创建对象数组的方案分析

Arduino无std::vector下的LED分段对象实现方案分析与选择

我在为Arduino编写代码,由于Arduino不支持std::vector,从未使用过该容器。现在需要实现分段可自定义的LED灯带,每一段用独立对象表示,固定最大分段数即可,无需动态数组。

我总结了三种实现方式,以下用Test类演示:

#include<iostream>
using namespace std;

class Test {
private:
    int var = 0;

public:
    Test () {}

    Test(int input) {
        var = input;
    }

    ~Test() {
        cout << "Instance with var = " << var << " deleted" << endl;
    }

    void printTest() {
        cout << "var = " << var << endl;
    }
};

方案1:用new填充指针数组

int main() {
    int maxTest = 10;
    Test* test[maxTest];

    test[0] = new Test(10);
    test[0]->printTest();
    delete test[0];

    return 0;
}

输出:

var = 10
Instance with var = 10 deleted

该方案是多数人推荐的标准方式,但无法使用delete[],需逐个删除实例;未初始化的指针执行delete会导致程序崩溃,因此需要单独跟踪已创建对象的位置和数量。

方案2:用new初始化数组

int main() {
    int maxTest = 10;
    Test* test = new Test[maxTest];

    test[0] = Test(10);
    test[0].printTest();
    delete[] test;

    return 0;
}

输出:

Instance with var = 10 deleted
var = 10
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 0 deleted
Instance with var = 10 deleted

该方案较为常见,但赋值时会先调用析构函数,且始终存在maxTest个实例,效率较低;同时存在疑问:为何第一个析构实例的var值为10而非0?

方案3:直接创建栈上数组

int main() {
    int maxTest = 10;
    Test test[maxTest];

    test[0] = Test(10);
    test[0].printTest();

    return 0;
}

输出与方案2相同。存在疑问:为何该方案少见?在Arduino这类封闭系统中,栈内存足够时是否可行?


请问是否有其他实用的实现方式?该如何选择及原因?

内容的提问来源于stack exchange,提问作者Morten360

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:10:38