C++ 在类构造函数中分配内存

C++ 在类构造函数中分配内存,c++,memory,avr,atmel,C++,Memory,Avr,Atmel,我正在使用Atmel AVR ATmega328p芯片,我正在尝试创建多个不同长度的环形缓冲区,使用FifoBuffer类,在我创建的FifoBuffer.h文件中 class FifoBuffer { private: uint8_t buf_head; // Head position, where next character is to be added uint8_t buf_tail; // Tail position, when next chara

我正在使用Atmel AVR ATmega328p芯片,我正在尝试创建多个不同长度的环形缓冲区,使用FifoBuffer类,在我创建的FifoBuffer.h文件中

class FifoBuffer {

    private:

    uint8_t buf_head;  // Head position, where next character is to be added
    uint8_t buf_tail;  // Tail position, when next character is to be removed
    uint8_t buf_size;  // Size of buffer in number of characters
    uint8_t *buffer;   // Declare buffer pointer

    public:

    FifoBuffer (uint8_t); // Constructor declaration

    uint8_t get () { return buffer[2]; }

    void put (uint8_t character) { }

    void empty () { }

    uint8_t count () { return 10; }

    uint8_t head () { return buf_head; }

    uint8_t tail () { return buf_tail; }

    uint8_t size () { return buf_size; }
};

// Constructor
//
FifoBuffer::FifoBuffer (uint8_t buffer_length) {
    buf_head   = 0;
    buf_tail   = 0;
    buf_size   = buffer_length;
    buffer     = new uint8_t [buffer_length];
    buffer[1] = 20; // Test
    buffer[2] = 16; // Test
    buffer[3] = 32; // Test
}
在main.cpp文件中,我有

...

void *operator new(size_t s)     { return malloc(s); }
void *operator new[](size_t s)   { return malloc(s); }
void  operator delete(void *m)   { free(m); }
void  operator delete[](void *m) { free(m); }

#include "fifobuffer.h"

...

FifoBuffer tty_rx_buf(64);
FifoBuffer tty_tx_buf(64);

uint8_t ttt = tty_rx_buf.get();
show_8_bits (ttt, 'n');  
ttt = tty_rx_buf.size();
show_8_bits (ttt, 'n');  

...
现在一切都符合要求,
.get()
返回16,
.size()
返回64,这是我所期望的。 但是我观察到程序的大小(程序内存使用量:1194字节,数据内存使用量:11字节)没有改变,无论我为环形缓冲区构造函数调用选择的大小是64还是10。当我只调用1个环形缓冲区构造函数时,内存使用会发生变化,分别为1178字节和11字节

我担心
buffer=newuint8\t[buffer\u length]
行实际上没有分配缓冲区长度字节


我的担心有理由吗?有更好的方法吗?是的,我是新手。

您没有“正确”获取内存报告的原因是编译器没有跟踪在
malloc()
调用中分配的内存:例如,您可能有如下代码:

if (PINSB && 0x01) {
    myPtr = malloc(0x10);
}
上面的示例说明的是由于实际情况(例如输入引脚上的电压水平)而进行或未进行的
malloc()
调用。编译器不知道何时/如何调用
malloc()
free()
,因此无法跟踪该内存。它跟踪的唯一内存是在堆栈上分配的变量,即在没有调用malloc()的情况下分配的内存。为了说明这种对比:

char dataA[10];   // Counted by compiler as memory
char* dataB = malloc(10); // Not counted by compiler except for the size of the pointer dataB itself.

无法“正确”获取内存报告的原因是编译器没有跟踪在
malloc()
调用中分配的内存:例如,您可能有如下代码:

if (PINSB && 0x01) {
    myPtr = malloc(0x10);
}
上面的示例说明的是由于实际情况(例如输入引脚上的电压水平)而进行或未进行的
malloc()
调用。编译器不知道何时/如何调用
malloc()
free()
,因此无法跟踪该内存。它跟踪的唯一内存是在堆栈上分配的变量,即在没有调用malloc()的情况下分配的内存。为了说明这种对比:

char dataA[10];   // Counted by compiler as memory
char* dataB = malloc(10); // Not counted by compiler except for the size of the pointer dataB itself.

这叫什么?在为微控制器编写代码时,默认情况下不会获得malloc。您使用的是提供malloc实现的库吗?
malloc()
尽管通常AVR程序是在不使用
malloc()的情况下编写的是的,我使用的库是#include#include/#test#include#include#include#include#include#这是什么调用malloc?在为微控制器编写代码时,默认情况下不会获得malloc。你使用的是提供malloc实现的库吗?
malloc()
虽然通常AVR程序是在没有
malloc()的情况下编写的,但是我使用的库是#include#include/#test#include#include#include#Wow@angelatlarge,谢谢。现在有道理了。然后我必须跟踪我在环形缓冲区中使用的内容,并将其添加到编译器知道的内存大小中。由于我在开始时只调用一次构造函数,而且环缓冲区在第一次设置后大小不会改变,有没有更好的方法来设置环缓冲区存储?您想要使用的缓冲区大小不会在运行中改变,对吗?在编译之前/编译时设置一次,然后继续,对吗?是的,@angelatlarge。我将有4个缓冲区,4个固定大小,但每个大小不同,一开始设置一次,并且不会动态更改。要分配堆栈上的所有内容,可以做一件事:在
setup()
中分配堆栈上的缓冲区数据数组,使用
\define
s指定缓冲区大小,然后在构造每个
FifoBuffer
时将指针传递给该对象。它确实稍微破坏了封装,但您可能会认为这是一个合适的价格。这将允许您摆脱
new()
delete
操作符,我想您会同意这有点笨拙。另外,您将确切地知道您的程序占用了多少宝贵的SRAM。你觉得怎么样?哇@angelatlarge,谢谢。现在有道理了。然后我必须跟踪我在环形缓冲区中使用的内容,并将其添加到编译器知道的内存大小中。由于我在开始时只调用一次构造函数,而且环缓冲区在第一次设置后大小不会改变,有没有更好的方法来设置环缓冲区存储?您想要使用的缓冲区大小不会在运行中改变,对吗?在编译之前/编译时设置一次,然后继续,对吗?是的,@angelatlarge。我将有4个缓冲区,4个固定大小,但每个大小不同,一开始设置一次,并且不会动态更改。要分配堆栈上的所有内容,可以做一件事:在
setup()
中分配堆栈上的缓冲区数据数组,使用
\define
s指定缓冲区大小,然后在构造每个
FifoBuffer
时将指针传递给该对象。它确实稍微破坏了封装,但您可能会认为这是一个合适的价格。这将允许您摆脱
new()
delete
操作符,我想您会同意这有点笨拙。另外,您将确切地知道您的程序占用了多少宝贵的SRAM。你怎么认为?