c ++内存分配错误?

c++ Memory allocated wrong?

我在一行代码上工作了三天,我发现似乎分配的内存不是我想象的那样。

我有一个Buffer class,它拥有两个int变量和一个*float指针,我认为它占用了16个字节的内存。

我还有一个 Film class,它包含两个 int 变量、两个 Vec3f 变量和一个 Buffer* 指针。 Vec3f 是一个 class,它包含三个 float 变量。

Class定义如下:

class Buffer {
    public:
        int _width;
        int _heigth;
        Vec3f *_data;

        Buffer(int w, int h) : _width(w), _height(h) {
            _data = new Vec3f(_width*_heigth);
        }
        ~Buffer();
    };

struct Film {
        int _width;
        int _height;
        Vec3f _left_bottom_corner;
        Vec3f _left_up_corner;
        Buffer *_cbuffer;

        Film(int w, int h, Buffer *cbuffer) : _width(w), _height(h), _cbuffer(cbuffer) {}   
};

template<typename ElementType, unsigned Size>
    class Vector {
    private:
        std::array<ElementType, Size> _v;
};
typedef Vector<float, 3> Vec3f;

我这样初始化它们:

int w = 5; int h = 5;
Buffer *b = new Buffer(w, h);
Film *film = new Film(w, h, b);

当我试图给 film->_cbuffer->data[i] 赋值时发生了一些奇怪的事情所以我调试了程序

std::cout << b << std::endl;
std::cout << b->_data << std::endl;
std::cout << film << std::endl;

输出为

0x7fa500500000
0x7fa500600000
0x7fa500600010

我认为一个 Buffer 实例应该占用 16 个字节,一个 Film 实例应该占用 4*2 + 4*3*2 + 8 字节。但真正重要的是 Buffer._data 数组的大小,我用 new 运算符手动分配了它。

从给定的结果来看,数组最多占用 16 个字节,这对于我测试过的所有 wh 都是固定的,这不是我想的。以w=5, h=5为例,数组的大小应该是5 * 5 * 8 .

对于这样分配的内存,film._width会在 当wh都设置为1时,意外分配了内存"right":

0x7f90b9d00000
0x7f90b9d00010
0x7f90b9d00020

你没看出这里有问题吗?

Buffer(int w, int h) {
   _data = new Vec3f(_width*_heigth);
}

使用未初始化的_width_heigth不奇怪吗?可能你想要:

Buffer(int w, int h): _width(w), _heigth(h) {
   _data = new Vec3f[_width*_heigth];
}

下面一行输出_data指向的Vec3f数组的地址。

std::cout << b->_data << std::endl;

如果你要查看 Buffer 对象中 _data 的地址,它应该是

std::cout << &b->_data << std::endl;

new Vec3f(_width*_heigth) 不初始化任何可变长度的数组。 Vec3f 数组字段的大小始终为 3,这可能不是您在缓冲区构造函数中想要的。顺便说一句,您根本没有任何 Vector::Vector(some_kind_of_int) 构造函数。

可能您想在缓冲区中使用 (runtime-known 大小) std::vector 而不是基于 (compiletime-known 常量 (AKA constexpr) 长度) std::array