C++ 内存分配错误?
c++ Memory allocated wrong?
我已经在一行代码上工作了三天,我发现分配的内存似乎不像我想象的那样。
我有一个Buffer
类,它拥有两个int
变量和一个*float
指针,我认为它在内存中占用了 16 个字节。
我还有一个Film
类,其中包含两个int
变量、两个Vec3f
变量和一个Buffer*
指针。Vec3f
是一个包含三个float
变量的类。
类定义如下:
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
时,内存被意外地分配为"正确":
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)
构造函数。
您可能想在缓冲区中使用(运行时已知大小)std::vector
,而不是基于(编译时已知常量 (AKAconstexpr
) 长度)std::array
的内容。
- vector.resize()中的分配错误
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 如何修复只读对象中成员的错误分配?
- 无法将错误分配给成员函数中"类型的实体"
- 分段错误分配函数结果
- 如何实现,错误分配中止而不是抛出异常
- C++代码错误分配
- 如何修复错误分配C++运行时错误
- 分段错误 - 分配类困难
- 带有数组类型表达式的错误分配
- Sprintf 缓冲区问题,错误分配给字符数组
- 而 (p=strtok(NULL, "," )) 警告:p可识别的错误分配
- 错误:分配只读位置“arr2.IntArray::operator[](1)”arr2[1]=24;
- std::映射错误分配错误
- 为什么"e.what()"打印"错误分配"?
- std::vector<const char *>的错误分配效果?
- 使用指向类的指针进行错误分配
- 错误:分配只读引用“__b”
- 向量错误分配错误 C++