为什么这个C ++代码会导致运行时错误?

时间:2013-05-22 18:22:35

标签: c++ visual-c++ vector constructor runtime-error

当我尝试在Visual Studio 2010中运行此代码时出现以下错误:

  
    

matrix.exe中0x012c23d3处的未处理异常:0xC0000005:访问冲突读取位置0xccccccd0。

  

以下是代码:

#include <vector>

using namespace std;

class matrix : public vector<vector<char>> {
  public:
    matrix(int x, int y) {
        this->resize(x);
        for (int i = 0; i < y; ++i) {
            this[i].resize(y);
        }
    }
};

void main() {
    matrix mat(10, 10);
}

我正在尝试通过添加内置矩阵操作函数来创建扩展matrix类型的vector<vector<char>>类。但是,我无法让这个构造函数正常运行。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

首先,不要公开从标准容器继承:它们不适用于它,没有虚拟析构函数。即使你从来没有打算通过基类指针删除你的派生,有人会在几年后出现,并且没有意识到陷阱。继承标准容器protectedprivate是正常的,因为你不能试图多态破坏你的孩子。

然后您的问题有两个:i < y而不是i < x在您的循环条件中而this[i]而不是(*this)[i]会导致它使用父类{{1}而不是数组和指针上的运算符的内置operator[]

但是你的整个构造函数都可以完成:

[]

答案 1 :(得分:3)

我建议重写如下: http://ideone.com/mzsE8e

#include <vector>
#include <iostream>

template <typename T>
using matrix = std::vector<std::vector<T>>;

template <typename T>
matrix<T> make_matrix(size_t x, size_t y)
{
    return { x, typename matrix<T>::value_type(y) };
}

int main() {
    auto mat = make_matrix<char>(3, 5);


    // for demonstration only:
    for (auto& row : mat)
    {
        for (auto& cel : row)
            std::cout << (int) cel << " ";
        std::cout << "\n";
    }
}

答案 2 :(得分:2)

除了所有其他建议之外,您的问题还在线上:

this[i].resize(y);

因为它没有做你想要的。它正在通过i字节移动这个指针。由于您要访问[]运算符,因此需要取消引用指针:

(*this)[i].resize(y);

答案 3 :(得分:0)

请改为尝试:

class matrix : public vector< vector< char > >
{
public:
    matrix(int x, int y)
    {
        vector< char > _val(y, 0);
        this->resize(x, _val);
    }
};