C++ C++;看似无关的数组导致程序崩溃

C++ C++;看似无关的数组导致程序崩溃,c++,C++,我正在用OpenGL开发一个地形生成器,遇到了一个奇怪的错误。我可以定义形成地形的三角形的长度如下: #define TRIANGLE_WIDTH 0.25f #define INVERSE_TRIANGLE_WIDTH 4 typedef std::array<std::array<glm::vec3, CHUNK_SIDE_LENGHT>, CHUNK_SIDE_LENGHT> MapDataVec3Type; typedef std::array<std:

我正在用OpenGL开发一个地形生成器,遇到了一个奇怪的错误。我可以定义形成地形的三角形的长度如下:

#define TRIANGLE_WIDTH 0.25f 
#define INVERSE_TRIANGLE_WIDTH 4
typedef std::array<std::array<glm::vec3, CHUNK_SIDE_LENGHT>, CHUNK_SIDE_LENGHT> MapDataVec3Type;
typedef std::array<std::array<glm::vec2, CHUNK_SIDE_LENGHT>, CHUNK_SIDE_LENGHT> MapDataVec2Type;
#define CHUNK_SIDE_LENGHT (CHUNK_WIDTH * INVERSE_TRIANGLE_WIDTH)
#define CHUNK_SIDE_LENGHT_FLOAT (float)(CHUNK_SIDE_LENGHT)
#define CHUNK_ARRAY_SIZE CHUNK_SIDE_LENGHT * CHUNK_SIDE_LENGHT


#if CHUNK_ARRAY_SIZE >= 65535
#define MAP_INDICES_ARRAY_TYPE unsigned int
#define MAP_INDICES_ARRAY_GL_TYPE GL_UNSIGNED_INT
#else
#define MAP_INDICES_ARRAY_TYPE unsigned short
#define MAP_INDICES_ARRAY_GL_TYPE GL_UNSIGNED_SHORT
#endif
int main(int argc, const char * argv[]) {
    std::random_device randomDevice;
    std::mt19937 randomEngine(randomDevice());

    bool capFps = true;
    int fpsCap = 60;
    double frameTimeCap = double(1e6) / double(fpsCap);
    std::chrono::steady_clock::time_point start, end;


    std::cout << "Main Thread ID: " << std::this_thread::get_id() << std::endl;
使用这些大小,我创建了用于存储地形数据的阵列。我为数组制作了一些typedef,如下所示:

#define TRIANGLE_WIDTH 0.25f 
#define INVERSE_TRIANGLE_WIDTH 4
typedef std::array<std::array<glm::vec3, CHUNK_SIDE_LENGHT>, CHUNK_SIDE_LENGHT> MapDataVec3Type;
typedef std::array<std::array<glm::vec2, CHUNK_SIDE_LENGHT>, CHUNK_SIDE_LENGHT> MapDataVec2Type;
#define CHUNK_SIDE_LENGHT (CHUNK_WIDTH * INVERSE_TRIANGLE_WIDTH)
#define CHUNK_SIDE_LENGHT_FLOAT (float)(CHUNK_SIDE_LENGHT)
#define CHUNK_ARRAY_SIZE CHUNK_SIDE_LENGHT * CHUNK_SIDE_LENGHT


#if CHUNK_ARRAY_SIZE >= 65535
#define MAP_INDICES_ARRAY_TYPE unsigned int
#define MAP_INDICES_ARRAY_GL_TYPE GL_UNSIGNED_INT
#else
#define MAP_INDICES_ARRAY_TYPE unsigned short
#define MAP_INDICES_ARRAY_GL_TYPE GL_UNSIGNED_SHORT
#endif
int main(int argc, const char * argv[]) {
    std::random_device randomDevice;
    std::mt19937 randomEngine(randomDevice());

    bool capFps = true;
    int fpsCap = 60;
    double frameTimeCap = double(1e6) / double(fpsCap);
    std::chrono::steady_clock::time_point start, end;


    std::cout << "Main Thread ID: " << std::this_thread::get_id() << std::endl;
这一切都有效,但当
三角形的宽度小于
0.125时,我在运行程序时会崩溃

我正在使用Xcode,每当程序崩溃时,Xcode都会显示错误在汇编代码中的位置:

SDL-OpenGL-Tests-3`main:
    0x100030760 <+0>:     pushq  %rbp
    0x100030761 <+1>:     movq   %rsp, %rbp
    0x100030764 <+4>:     subq   $0x807f60, %rsp           ; imm = 0x807F60 
    0x10003076b <+11>:    movq   0x5b936(%rip), %rax       ; (void *)0x00007fff92ccdd40: __stack_chk_guard
    0x100030772 <+18>:    movq   (%rax), %rax
    0x100030775 <+21>:    movq   %rax, -0x8(%rbp)
    0x100030779 <+25>:    movl   $0x0, -0x291c(%rbp)
    0x100030783 <+35>:    movl   %edi, -0x2920(%rbp)
    0x100030789 <+41>:    movq   %rsi, -0x2928(%rbp)
    0x100030790 <+48>:    leaq   0x4357b(%rip), %rsi       ; "/dev/urandom"
    0x100030797 <+55>:    leaq   -0x2948(%rbp), %rax
    0x10003079e <+62>:    movq   %rax, %rdi
->  0x1000307a1 <+65>:    movq   %rax, -0x807178(%rbp)
    0x1000307a8 <+72>:    callq  0x100030090               ; std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string<std::nullptr_t> at string:817
    0x1000307ad <+77>:    leaq   -0x2930(%rbp), %rdi
我真的不知道我的地形生成如何影响C++的随机函数,因为我在地形生成中不使用随机引擎,所以我用它随机地放置一些光源。p> 更新:

因为ELSAMUCO指出,我应该把C++随机函数与一些伪随机数互换,我去掉了随机函数,现在只把所有的随机值设置为0,现在仍然用这个代码崩溃:

SDL-OpenGL-Tests-3`main:
    0x10002fc30 <+0>:     pushq  %rbp
    0x10002fc31 <+1>:     movq   %rsp, %rbp
    0x10002fc34 <+4>:     subq   $0x807510, %rsp           ; imm = 0x807510 
    0x10002fc3b <+11>:    movsd  0x5aacd(%rip), %xmm0      ; typeinfo name for Sphere + 12, xmm0 = mem[0],zero 
    0x10002fc43 <+19>:    movq   0x5c45e(%rip), %rax       ; (void *)0x00007fff92ccdd40: __stack_chk_guard
    0x10002fc4a <+26>:    movq   (%rax), %rax
    0x10002fc4d <+29>:    movq   %rax, -0x8(%rbp)
    0x10002fc51 <+33>:    movl   $0x0, -0x291c(%rbp)
    0x10002fc5b <+43>:    movl   %edi, -0x2920(%rbp)
    0x10002fc61 <+49>:    movq   %rsi, -0x2928(%rbp)
    0x10002fc68 <+56>:    movb   $0x1, -0x2929(%rbp)
    0x10002fc6f <+63>:    movl   $0x3c, -0x2930(%rbp)
    0x10002fc79 <+73>:    cvtsi2sdl -0x2930(%rbp), %xmm1
    0x10002fc81 <+81>:    divsd  %xmm1, %xmm0
    0x10002fc85 <+85>:    movsd  %xmm0, -0x2938(%rbp)
    0x10002fc8d <+93>:    leaq   -0x2940(%rbp), %rdi
->  0x10002fc94 <+100>:   callq  0x100038310               ; std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > >::time_point at chrono:1338
    0x10002fc99 <+105>:   leaq   -0x2948(%rbp), %rdi
    0x10002fca0 <+112>:   callq  0x100038310               ; std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > >::time_point at chrono:1338
    0x10002fca5 <+117>:   movq   0x5c384(%rip), %rdi       ; (void *)0x00007fff92814760: std::__1::cout
    0x10002fcac <+124>:   leaq   0x44007(%rip), %rsi       ; "Main Thread ID: "
    0x10002fcb3 <+131>:   callq  0x10007132c               ; symbol stub for: std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*)
SDL-OpenGL-Tests-3`main:
0x10002fc30:pushq%rbp
0x10002fc31:movq%rsp,%rbp
0x10002fc34:subq$0x807510,%rsp;imm=0x807510
0x10002fc3b:movsd 0x5aacd(%rip),%xmm0;球体+12的类型信息名称,xmm0=mem[0],零
0x10002fc43:movq 0x5c45e(%rip),%rax;(无效*)0x00007fff92ccdd40:uu堆栈_uchk_u保护
0x10002fc4a:movq(%rax),%rax
0x10002fc4d:movq%rax,-0x8(%rbp)
0x10002fc51:movl$0x0,-0x291c(%rbp)
0x10002fc5b:movl%edi,-0x2920(%rbp)
0x10002fc61:movq%rsi,-0x2928(%rbp)
0x10002fc68:movb$0x1,-0x2929(%rbp)
0x10002fc6f:movl$0x3c,-0x2930(%rbp)
0x10002fc79:cvtsi2sdl-0x2930(%rbp),%xmm1
0x10002fc81:divsd%xmm1,%xmm0
0x10002fc85:movsd%xmm0,-0x2938(%rbp)
0x10002fc8d:leaq-0x2940(%rbp),%rdi
->0x10002fc94:callq 0x100038310;时间点:时间点:时间点:1338
0x10002fc99:leaq-0x2948(%rbp),%rdi
0x10002fca0:callq 0x100038310;时间点:时间点:时间点:1338
0x10002fca5:movq 0x5c384(%rip),%rdi;(void*)0x00007fff92814760:std:_1::cout
0x100002FCAC:leaq 0x44007(%rip),%rsi;“主线程ID:”

0x10002fcb3:callq 0x10007132c;符号存根:std::_1::basic_ostream&std::_1::operator崩溃是由于堆栈太大时发生的堆栈溢出造成的。最简单的解决方案是使用
std::unique_ptr
,因为此数组将在堆上分配

评论不用于扩展讨论;这段对话已经结束。