访问动态 2D 字符数组时引发访问冲突异常

Posted

技术标签:

【中文标题】访问动态 2D 字符数组时引发访问冲突异常【英文标题】:Access Violation Exception Raised when Accessing a Dynamic 2D char Array 【发布时间】: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 / deletestd::vector&lt;std::string&gt; 不符合您的需求吗? @Tyler 不,这不是问题,代码甚至无法编译。 您为什么使用char 数据类型?如果你想要 8 位宽,你应该更喜欢 uint8_tint8_tchar 可以是有符号、无符号或字符。 char 的 最小 范围是 8 位,没有什么可以阻止实现为 char 使用 16 位或 32 位。 如果必须使用数组,我建议分配一维数组,然后应用公式将行和列寻址转换为整数索引。 【参考方案1】:

memset 的第三个参数是你要设置的字节数。

然而

sizeof m_cube_base_pointer[i]

会给你指针的大小,而不是你刚刚分配的动态数组的大小。所以为了得到你想要设置的正确字节数,你应该这样做

sizeof(char) * m_fields * m_fields

相反。你的 memset 调用应该变成这样:

memset(m_cube_base_pointer[i], i, sizeof(char) * m_fields * m_fields);

【讨论】:

以上是关于访问动态 2D 字符数组时引发访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章

使用2d数组写入访问冲突

[使用映射到1D的2D数组的访问冲突读取位置

c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?

我的动态数组模板类正在做奇怪的事情

删除动态分配的二维数组时发生错误?

如果分配该数组引发异常,你应该释放一个数组吗?