用new关键字创建的c ++对象不呈现;在堆栈上创建的对象

时间:2012-11-01 15:44:52

标签: c++ opengl

编辑:我已删除所有纹理和法线贴图,但问题仍然存在

我试图在屏幕上绘制一块地形。渲染函数如下所示:

void TerrainChunk::Render()
{
   std::cout << "Render Me!\n";
   glColor3f(0.5f, 0.5f, 0.5f)
   glDisable(GL_LIGHTING);
   for(int x = 1; x < kChunkSize - 1; x++)
   {
      for(int z = 1; z < kChunkSize - 1; z++)
      {
         std::cout << height_map_[x][z] << " ";
         glBegin(GL_TRIANGLE_STRIP);
            glVertex3f(x, height_map_[x][z], z);
            glVertex3f(x+1, height_map_[x+1][z], z);       
            glVertex3f(x, height_map_[x][z+1], z+1);
            glVertex3f(x+1, height_map_[x+1][z+1], z+1);
         glEnd();
      }
      std::cout << std::endl;
   }
   glEnable(GL_LIGHTING);
}

在堆栈上创建对象时

TerrainChunk chunk("chunk1.png", "grass.png");
chunk.Init();

它完美呈现。

当我用新的

创建它时
TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();
什么都没有显示出来。在这两种情况下,都会调用Render并打印出正确的高度图。我希望这两种情况的行为都相同。

编辑:这是我们要求的Init()代码。它所做的只是在每次调用Render()时加载我已经验证过的高度图。

void TerrainChunk::Init()
{
   std::cout << height_file_ << ", " << texture_file_ << std::endl;

   //Load height map
   SDL_Surface *temp = IMG_Load(height_file_.c_str());
   if(!temp)
   {
      printf("Failed to load chunk.\n");
      exit(-1);
   }
   Uint32 *pixels = (Uint32 *)temp->pixels;
   for(int z = 0; z < kChunkSize; z++)
   {
      for(int x = 0; x < kChunkSize; x++)
      {
         Uint8 r, g, b;
         SDL_GetRGB(pixels[x + z * temp->w], temp->format, &r, &g, &b);
         height_map_[x][z] = g / 12;
      }
   }
}

2 个答案:

答案 0 :(得分:1)

当在堆栈上创建相同的对象时,但是在堆中创建时不会,或者反之亦然,通常是因为成员未被初始化。堆分配是零初始化的,而堆栈分配则不是。我建议在valgrind下运行你的程序,它很可能会告诉你什么是错的。

答案 1 :(得分:0)

我必须同意Luchian Grigore:基于堆栈的版本将在您使用时自动删除;基于堆的版本只会被显式删除。

如果你改变:

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();

要:

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();
delete chunk;

结果有何不同?