2013-07-31 51 views
1

我有一个问题,使用二维向量。我在我的main()调用之前在我的头文件中声明了双向量,并且在main.cpp文件中再次声明了双向量(不是extern)。我调用一个函数来动态地分配内存给双向量。给定的代码不会给出编译错误。但是在运行时,如果你访问vector,它会给Vector下标超出范围异常。我使用我的调试器检查了它,发现矢量在函数中分配了内存,但一旦它返回(超出函数范围),矢量大小就会回到0. 我已附上代码运行时错误的二维向量

color.h:

#ifndef __COLOR__ 
#define __COLOR__ 

class color{ 
     public : 
     int r,g,b; 

     color(void); 
     color(int R, int G,int B); 
    }; 
#endif 

color.cpp

#include"color.h" 
#include <iostream> 

color::color(void){ 
    r=g=b=0; 
} 
color::color(int R, int G,int B){ 
    if(R<=1 && G<=1 && B<=1){ 
    r=R;g=G;b=B; 
    } 
    else{ 
    std::cout<<"Error in RGB values"; 
    } 
} 

header.h:

#ifndef __HEADER__ 
#define __HEADER__ 

    #include <iostream> 
    #include <vector> 

    #include "color.h" 

    const int windowWidth=200; 
    const int windowHeight=200; 

    void function(); 

    extern std::vector <std::vector<color> > buffer; 

#endif __HEADER__ 

color.cpp

#ifndef __COLOR__ 
#define __COLOR__ 

class color{ 
     public : 
     int r,g,b; 

     color(void); 
     color(int R, int G,int B); 
    }; 
#endif 

的main.cpp

#include "header.h" 
std::vector <std::vector<color> > buffer; 
void main(void){ 
    //myClass obj=myClass(1,4); 

    function(/*obj*/); 
    std::cout<<"HI"; 
      std::cout<<"vector : "<<buffer[0][0].r; //VECTOR SUBSCRIPT OUT OF RANGE 
    getchar(); 
} 
void function(){ 
    std::vector <std::vector<color> > buffer (2*windowHeight, std::vector<color>(2*windowWidth)); 
    std::cout<<"HI"; 
} 

回答

0

你的函数调用function()有它在main.cpp中定义的变量buffer无不良影响。所以在你的主函数中,它试图访问它会导致未定义的行为。

如果您打算让function()修改全局buffer变量,那么可以让function()返回该向量。

std::vector <std::vector<color> > function() 
{ 
    std::vector <std::vector<color> > buffer (2*windowHeight, std::vector<color>(2*windowWidth)); 
    std::cout<<"HI"; 
    return buffer; 
} 

int main() 
{ 
    buffer = function(); 
    std::cout<<"vector : "<<buffer[0][0].r; // now you should be fine to access buffer elements 
}