C++ 向量分配崩溃

C++ 向量分配崩溃,c++,matrix,vector,error-handling,indexoutofboundsexception,C++,Matrix,Vector,Error Handling,Indexoutofboundsexception,它就在这里崩溃了,我不知道为什么。你的支票错了。应该是这样 newMatrix[i][j] = m[i][j]; for(i=0;i

它就在这里崩溃了,我不知道为什么。

你的支票错了。应该是这样

newMatrix[i][j] = m[i][j];
for(i=0;i
您正在分配到新的
newMatrix
中,但没有先设置其大小。它将默认为空,任何分配给它的尝试都将导致未定义的行为


因为你没有通过一个新的尺寸,所以很难确切地知道你想要完成什么。这就是为什么我没有更明确的建议来解决它。

除了@Saurav发布的内容之外,
newMatrix
是空的,所以你不能给
newMatrix[I][j]赋值
。您可以通过初始化给定大小的向量来解决此问题:

for (i = 0; i < m.size(); i++)        // m.size() gives the number of rows 
{
    for(j = 0; j < m[i].size(); j++)  // m[i].size() gives the number of columns in the row

如果要分配向量的向量,则需要在对矩阵进行索引之前为矩阵分配内存。因此,必须使用类似

vector< vector<int> > newMatrix(m);
newMatrix.resize(大小);
对于(int i=0;i

或者可以使用.push_back()vector方法向向量添加值,而无需事先分配内存。

vector
s
运算符[]
返回对指定元素的引用,而无需进行边界检查

这意味着它不会神奇地调整向量大小,也不会执行任何其他操作来确保元素存在。如果元素不存在,则结果是未定义的行为-这意味着任何事情都可能发生。实际上,它通常会导致程序访问无效的内存位置,从而导致崩溃

即使对于一个简单的
向量
,上述情况也是正确的。您通过使用
向量
(向量
的每个元素都是
向量
)来解决问题

您的函数实际上调用未定义行为的次数有点惊人。您碰巧在语句
newMatrix[i][j]=m[i][j]
上遇到了崩溃,但未定义行为的可能性实际上发生在这之前

在外部循环中,如果
m.size()
(您的代码没有检查)的值为零,
m[i]
将不存在。如果
m.size()
为零,则导致
m[i]
的求值(如
m.operator[](i)
)具有未定义的行为

本质上,您需要确保任何索引
i
在评估
m[i]
之前有效,然后还需要确保
j
在评估
m[i][j]之前是
m[i]
的有效索引
。然后对
newMatrix
执行相同的操作。您的代码根本不执行任何操作。您的函数的更正确呈现(假设目的是创建
m
的副本)是

它可以在完全没有你的功能的情况下达到同样的效果,就像

x = resizeVector(y);
这也更有效(无需函数调用,无需创建副本来传递值等)

vector< vector<int> > newMatrix(m);
newMatrix.resize(size);
for (int i = 0; i < size; ++i) {
    newMatrix[i].resize(size);
}
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
    vector< vector<int> > newMatrix;
    int i,j;

    newMatrix.resize(m.size());    //  necessary to ensure we can access newMatrix[i] in the loop below

    for (i = 0; i < m.size(); i++)     //   ensure i is a valid index of m
    {
        // newMatrix[i].size() is still zero, so we need to resize for use in the inner loop

        newMatrix[i].resize(m[i].size()); 

        for(j = 0; j < m[i].size(); j++)   // ensure j is a valid index of m[i]
        {
            newMatrix[i][j] = m[i][j];
        }
    }
    return (newMatrix);
}
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
      vector< vector<int> > newMatrix(m);  
      return newMatrix;
}
vector< vector<int> > resizeVector(vector< vector<int> > m)
{
      return m;
}
x = resizeVector(y);
x = y;