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 个字节,这对于我测试过的所有 w
和 h
都是固定的,这不是我想的。以w=5, h=5
为例,数组的大小应该是5 * 5 * 8 .
对于这样分配的内存,film._width
会在
当w
和h
都设置为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
。
我在一行代码上工作了三天,我发现似乎分配的内存不是我想象的那样。
我有一个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 个字节,这对于我测试过的所有 w
和 h
都是固定的,这不是我想的。以w=5, h=5
为例,数组的大小应该是5 * 5 * 8 .
对于这样分配的内存,film._width
会在
当w
和h
都设置为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
。