引用改变大小的向量时出现分段错误

问题描述 投票:0回答:1

因此,我在主函数中初始化一个向量,并将该向量作为引用传递到其大小发生变化的函数中。现在,我想象主函数中初始化的向量的大小会改变,但事实并非如此。我只是错误地执行了这个吗?

#include <iostream>
#include <vector>
using std::vector;

void createImage(vector<vector<char> >& img){
    int cols, rows;
    std::cin >> rows >> cols;
    img.clear();
    for(int i = 0; i < rows; i++)
        img.push_back(vector<char>(cols, 'O'));
}

void colorPixel(vector<vector<char> > &img){
    int xCoord, yCoord;
    char color;
    std::cin >> xCoord >> yCoord >> color;
    img[xCoord][yCoord] = color;
}

void printVector(vector<vector<char> > &img){
        for(int i = 0; i < img.size(); i++){
            for(int j = 0; j < img[i].size(); j++)
                std::cout << img[i][j];
            std::cout << '\n';
        }
}

int main(){

    char operation;
    
    while(std::cin >> operation){
        vector<vector<char> > myVector;
        if(operation == 'X')
            break;
        if(operation == 'I')
            createImage(myVector);
        if(operation == 'C')
            printVector(myVector);
        if(operation == 'L')
            colorPixel(myVector);
    }
}

编辑: 这就是正在发生的事情。当你创建向量时, I 5 5 调用 createImage() ,这是可行的,但是当你 L 4 4 P 调用 myVector[4][4] 处的 colorPixel() 时,它开始失败。

如果我将 main 中的 myVector 初始化为 250 250,则 print 将打印所有 250 行,即使在 createImage() 中更改了大小(例如 4 4)之后也是如此。

简而言之,我相信并且确信,main 中的向量没有得到其大小已更改的提示,是否有任何解决方案?

c++ vector segmentation-fault
1个回答
2
投票
    while(std::cin >> operation){
        vector<vector<char> > myVector;

在这个

while
循环中发生的第一件事是创建一个新的
myVector
。从字面上看,这就是 C++ 中所说的。

当到达循环末尾时,这个

myVector
就会被销毁。这就是 C++ 的工作原理:如果您在循环中或在
if
语句中声明一个对象,则当执行到达此范围的末尾时,该对象将被销毁。

因此,当这个

while
循环到达终点时,这个
myVector
就会被销毁。它不再存在了。它将会消失。它将轻松存在。它将渴望峡湾。它将成为前 myVector。

然后,再次检查

while
循环的条件,如果条件仍然成立,则执行再次进入
while
,从头开始创建一个新的
myVector
。无论如何,它与之前的 myVector 没有任何关系,这只是一个微弱的记忆。

解决这个问题的方法是在

myVector
的开始处声明这个 main before
,所以这个 
myVector
仅当
main
本身完成执行时才会被销毁。

© www.soinside.com 2019 - 2024. All rights reserved.