【发布时间】:2017-10-09 19:23:53
【问题描述】:
我目前遇到以下 C++ 类的问题,该类包含多维数据集的模型逻辑。构造函数创建一个动态二维字符数组,内容如下:
[ [0,0,0,0,0,0],
[1,1,1,1,1,1],
[2,2,2,2,2,2],
[3,3,3,3,3,3],
[4,4,4,4,4,4],
[5,5,5,5,5,5] ].
CubeModel.h
#ifndef CUBEMODEL_H_INCLUDED
#define CUBEMODEL_H_INCLUDED
#include <iostream>
class CubeModel
{
private:
const unsigned short m_faces;
const unsigned short m_fields;
char **m_cube_base_pointer;
public:
CubeModel(const unsigned short faces, const unsigned short fields);
~CubeModel();
void output();
};
#endif // CUBEMODEL_H_INCLUDED
CubeModel.cpp
#include "CubeModel.h"
CubeModel::CubeModel(const unsigned short faces, const unsigned short fields): m_faces(faces), m_fields(fields) {
m_cube_base_pointer = new char*[m_faces];
for (unsigned int i = 0; i < m_faces; ++i) {
m_cube_base_pointer[i] = new char[m_fields * m_fields];
memset(m_cube_base_pointer[i], i, sizeof m_cube_base_pointer[i]);
}
}
CubeModel::~CubeModel() {
for (unsigned int i = 0; i < m_faces; ++i) {
std::cout << (int) m_cube_base_pointer[i][0];
delete [] m_cube_base_pointer[i];
}
delete [] m_cube_base_pointer;
}
/*
Console output of the cube model
*/
void CubeModel::output() {
for (unsigned int i = 0; i < m_faces; ++i) {
for (unsigned int j = 0; j < m_fields * m_fields; ++j) {
std::cout << (int) m_cube_base_pointer[i][j] << std::endl; // output the model
}
}
}
main.cpp
#include <iostream>
#include "CubeModel.h"
using namespace std;
int main() {
CubeModel cube = CubeModel(6, 3);
cube.output();
system("PAUSE");
return 0;
}
当我在 main 函数中创建一个 CubeModel 对象并调用输出方法时,我在 Visual Studio 中收到以下错误消息:
在 Cube.exe 中的 0x00FC1DC8 处引发异常:0xC0000005:读取位置 0x00000000 时发生访问冲突。
异常是在 CubeModel 的 output() 方法中引发的。
我在这里做错了什么?
【问题讨论】:
-
在您使用
DEFAULT_FACES的默认构造函数中,我看不出这是在哪里定义的。可能是问题 -
你为什么要使用原始指针和
new/delete?std::vector<std::string>不符合您的需求吗? -
@Tyler 不,这不是问题,代码甚至无法编译。
-
您为什么使用
char数据类型?如果你想要 8 位宽,你应该更喜欢uint8_t或int8_t。char可以是有符号、无符号或字符。 char 的 最小 范围是 8 位,没有什么可以阻止实现为char使用 16 位或 32 位。 -
如果必须使用数组,我建议分配一维数组,然后应用公式将行和列寻址转换为整数索引。