Search code examples
c++openglmemory-leaksglut

glCallList Memory Leak


I am creating a 3D object by creating a glCallList with vectors, faces and and normal vectors. Even tho I delete all vectors items after usage, I noticed that the memory is filling up until the system freezes. I already analyzed the application with valgrind but didn't notice anything problematic. For example, here I create a 3D object:

void MyClass::drawObject() {


    glPushMatrix();

    std::vector<ObjCoordinate *> vertex;
    std::vector<ObjFace *> faces;
    std::vector<ObjCoordinate *> normals;

    vertex.push_back(new ObjCoordinate(-1.30287, -1.44034, 0.216688));
    vertex.push_back(new ObjCoordinate(-1.27961, -1.50539, 0.072052));
    vertex.push_back(new ObjCoordinate(-1.08061, -1.28665, 0.206139));
    vertex.push_back(new ObjCoordinate(-1.21638, -1.35257, 0.180025));
    vertex.push_back(new ObjCoordinate(-1.15207, -1.32099, 0.229603));
    vertex.push_back(new ObjCoordinate(-1.28515, -1.44447, 0.363248));
    vertex.push_back(new ObjCoordinate(-1.28928, -1.50988, 0.32576));
    vertex.push_back(new ObjCoordinate(-1.26158, -1.53761, 0.241082));
    vertex.push_back(new ObjCoordinate(-1.20301, -1.55354, 0.160082));
    vertex.push_back(new ObjCoordinate(-1.23054, -1.41658, 0.439494));
    vertex.push_back(new ObjCoordinate(-1.2319, -1.48643, 0.476053));
    vertex.push_back(new ObjCoordinate(-1.20001, -1.54897, 0.426928));
    vertex.push_back(new ObjCoordinate(-1.13637, -1.39263, 0.466446));
    vertex.push_back(new ObjCoordinate(-1.12158, -1.45057, 0.544793));
    vertex.push_back(new ObjCoordinate(-1.11357, -1.5188, 0.532664));
    vertex.push_back(new ObjCoordinate(-1.10002, -1.55842, 0.464288));
    vertex.push_back(new ObjCoordinate(-1.04322, -1.4075, 0.50493));
    vertex.push_back(new ObjCoordinate(-0.987058, -1.49763, 0.54012));
    vertex.push_back(new ObjCoordinate(-0.950752, -1.55954, 0.42481));
    vertex.push_back(new ObjCoordinate(-1.07206, -1.56899, 0.385537));
    vertex.push_back(new ObjCoordinate(-0.932486, -1.41533, 0.459069));
    vertex.push_back(new ObjCoordinate(-0.874065, -1.47041, 0.441795));
    vertex.push_back(new ObjCoordinate(-0.881756, -1.52362, 0.426011));
    vertex.push_back(new ObjCoordinate(-0.921452, -1.29853, 0.206971));
    vertex.push_back(new ObjCoordinate(-0.771931, -1.42509, 0.210098));
    vertex.push_back(new ObjCoordinate(-0.746773, -1.48725, 0.182829));
    vertex.push_back(new ObjCoordinate(-0.774339, -1.53451, 0.177566));
    vertex.push_back(new ObjCoordinate(-0.855455, -1.3279, 0.167282));
    vertex.push_back(new ObjCoordinate(-1.01916, -1.26652, 0.155538));
    vertex.push_back(new ObjCoordinate(-0.991061, -1.28652, 0.22452));
    vertex.push_back(new ObjCoordinate(-0.756721, -1.45955, 0.030918));
    vertex.push_back(new ObjCoordinate(-0.770647, -1.51682, 0.03924));
    vertex.push_back(new ObjCoordinate(-0.817663, -1.55395, 0.119195));
    vertex.push_back(new ObjCoordinate(-0.886225, -1.56266, 0.225088));
    vertex.push_back(new ObjCoordinate(-0.7967, -1.38249, 0.035854));
    vertex.push_back(new ObjCoordinate(-0.904208, -1.29591, 0.044522));
    vertex.push_back(new ObjCoordinate(-0.819127, -1.47748, -0.078676));
    vertex.push_back(new ObjCoordinate(-0.838126, -1.5358, -0.033324));
    vertex.push_back(new ObjCoordinate(-0.848241, -1.41404, -0.094209));
    vertex.push_back(new ObjCoordinate(-1.02568, -1.55382, 0.176562));
    vertex.push_back(new ObjCoordinate(-0.971872, -1.26754, 0.086063));
    vertex.push_back(new ObjCoordinate(-0.92238, -1.54838, -0.059034));
    vertex.push_back(new ObjCoordinate(-0.948484, -1.32027, -0.059503));
    vertex.push_back(new ObjCoordinate(-0.981524, -1.42006, -0.157504));
    vertex.push_back(new ObjCoordinate(-0.920155, -1.49055, -0.145955));
    vertex.push_back(new ObjCoordinate(-1.04709, -1.55412, -0.033783));
    vertex.push_back(new ObjCoordinate(-1.03018, -1.28025, 0.012423));
    vertex.push_back(new ObjCoordinate(-1.07872, -1.3425, -0.081606));
    vertex.push_back(new ObjCoordinate(-1.07475, -1.51965, -0.127059));
    vertex.push_back(new ObjCoordinate(-1.17664, -1.36255, -0.030069));
    vertex.push_back(new ObjCoordinate(-1.12364, -1.42699, -0.138141));
    vertex.push_back(new ObjCoordinate(-1.07618, -1.27108, 0.0936));
    vertex.push_back(new ObjCoordinate(-1.19638, -1.53617, -0.015344));
    vertex.push_back(new ObjCoordinate(-1.14774, -1.3108, 0.054986));
    vertex.push_back(new ObjCoordinate(-1.23368, -1.46416, -0.053383));
    vertex.push_back(new ObjCoordinate(-1.28552, -1.43121, 0.076094));
    normals.push_back(new ObjCoordinate(0.005, -0.9974, -0.0713));
    normals.push_back(new ObjCoordinate(-0.6866, 0.7197, 0.1033));
    normals.push_back(new ObjCoordinate(-0.2374, -0.9712, 0.0193));
    normals.push_back(new ObjCoordinate(-0.5388, 0.8243, 0.174));
    normals.push_back(new ObjCoordinate(-0.3386, 0.8976, 0.2822));
    normals.push_back(new ObjCoordinate(-0.505, -0.8554, 0.115));
    normals.push_back(new ObjCoordinate(-0.8265, 0.2736, 0.4919));
    normals.push_back(new ObjCoordinate(-0.6855, -0.6326, 0.3604));
    normals.push_back(new ObjCoordinate(-0.1487, -0.9887, 0.0186));
    normals.push_back(new ObjCoordinate(-0.3148, 0.9007, 0.2993));
    normals.push_back(new ObjCoordinate(-0.4678, -0.2077, 0.8591));
    normals.push_back(new ObjCoordinate(-0.3541, 0.7187, 0.5984));
    normals.push_back(new ObjCoordinate(-0.2487, -0.8586, 0.4483));
    normals.push_back(new ObjCoordinate(-0.0634, 0.9513, 0.3016));
    normals.push_back(new ObjCoordinate(-0.0757, 0.9291, 0.362));
    normals.push_back(new ObjCoordinate(0.1903, 0.4577, 0.8685));
    normals.push_back(new ObjCoordinate(-0.0352, -0.9962, -0.0801));
    normals.push_back(new ObjCoordinate(0.2365, 0.8754, 0.4217));
    normals.push_back(new ObjCoordinate(0.561, 0.3614, 0.7447));
    normals.push_back(new ObjCoordinate(0.6664, -0.299, 0.683));
    normals.push_back(new ObjCoordinate(0.2555, 0.8729, 0.4156));
    normals.push_back(new ObjCoordinate(0.0658, -0.9972, 0.0368));
    normals.push_back(new ObjCoordinate(0.8883, 0.1729, 0.4254));
    normals.push_back(new ObjCoordinate(0.8611, -0.255, 0.4399));
    normals.push_back(new ObjCoordinate(0.4462, -0.8647, 0.2308));
    normals.push_back(new ObjCoordinate(0.5542, 0.7458, 0.3698));
    normals.push_back(new ObjCoordinate(0.2842, -0.9528, 0.1063));
    normals.push_back(new ObjCoordinate(0.7447, 0.665, 0.0567));
    normals.push_back(new ObjCoordinate(0.4361, 0.8979, 0.0608));
    normals.push_back(new ObjCoordinate(0.4257, -0.8901, -0.163));
    normals.push_back(new ObjCoordinate(0.1881, -0.972, -0.1409));
    normals.push_back(new ObjCoordinate(0.7938, 0.4388, -0.421));
    normals.push_back(new ObjCoordinate(0.8547, -0.2721, -0.4422));
    normals.push_back(new ObjCoordinate(0.5532, 0.7275, -0.4058));
    normals.push_back(new ObjCoordinate(0.5494, 0.0479, -0.8342));
    normals.push_back(new ObjCoordinate(0.1958, 0.9286, -0.3154));
    normals.push_back(new ObjCoordinate(0.3177, 0.6087, -0.727));
    normals.push_back(new ObjCoordinate(-0.0255, -0.9401, -0.3399));
    normals.push_back(new ObjCoordinate(-0.0367, 0.9985, -0.0397));
    normals.push_back(new ObjCoordinate(-0.0541, 0.8452, -0.5316));
    normals.push_back(new ObjCoordinate(0.0016, 0.7004, -0.7138));
    normals.push_back(new ObjCoordinate(-0.4998, -0.5926, -0.6317));
    normals.push_back(new ObjCoordinate(-0.3383, 0.8943, -0.2928));
    normals.push_back(new ObjCoordinate(-0.6296, 0.4915, -0.6018));
    normals.push_back(new ObjCoordinate(-0.6613, 0.7193, -0.213));
    normals.push_back(new ObjCoordinate(-0.4933, 0.8696, 0.0197));
    normals.push_back(new ObjCoordinate(-0.4528, -0.8835, -0.1201));
    normals.push_back(new ObjCoordinate(-0.7207, 0.6918, -0.044));
    normals.push_back(new ObjCoordinate(-0.4009, 0.9095, 0.1101));
    normals.push_back(new ObjCoordinate(-0.9893, -0.0719, -0.1268));
    normals.push_back(new ObjCoordinate(-0.7662, -0.6414, -0.0406));
    normals.push_back(new ObjCoordinate(0.1119, -0.85, 0.5148));
    normals.push_back(new ObjCoordinate(-0.6144, 0.7732, 0.1572));
    normals.push_back(new ObjCoordinate(-0.9928, -0.0059, 0.1199));
    normals.push_back(new ObjCoordinate(-0.9144, -0.1563, 0.3735));
    normals.push_back(new ObjCoordinate(-0.1262, -0.9881, 0.0878));
    normals.push_back(new ObjCoordinate(-0.575, 0.3882, 0.7202));
    normals.push_back(new ObjCoordinate(-0.4591, -0.6816, 0.5698));
    normals.push_back(new ObjCoordinate(-0.0159, 0.9191, 0.3936));
    normals.push_back(new ObjCoordinate(-0.1244, 0.7864, 0.6051));
    normals.push_back(new ObjCoordinate(0.0306, -0.9892, 0.1436));
    normals.push_back(new ObjCoordinate(-0.0282, -0.1782, 0.9836));
    normals.push_back(new ObjCoordinate(0.8872, 0.4611, -0.0134));
    normals.push_back(new ObjCoordinate(0.3572, 0.5244, 0.773));
    normals.push_back(new ObjCoordinate(0.385, -0.7571, 0.5277));
    normals.push_back(new ObjCoordinate(0.6855, 0.5957, 0.4187));
    normals.push_back(new ObjCoordinate(0.787, -0.4994, 0.3622));
    normals.push_back(new ObjCoordinate(0.6173, 0.6939, 0.3709));
    normals.push_back(new ObjCoordinate(0.2872, -0.9518, 0.1076));
    normals.push_back(new ObjCoordinate(0.5118, -0.8538, -0.0955));
    normals.push_back(new ObjCoordinate(0.9622, -0.2497, -0.1086));
    normals.push_back(new ObjCoordinate(0.0349, -0.9979, -0.0546));
    normals.push_back(new ObjCoordinate(0.6244, 0.7798, -0.0448));
    normals.push_back(new ObjCoordinate(0.2659, 0.9494, 0.167));
    normals.push_back(new ObjCoordinate(0.8224, 0.2526, -0.5097));
    normals.push_back(new ObjCoordinate(-0.124, -0.1821, -0.9754));
    normals.push_back(new ObjCoordinate(0.6663, -0.5808, -0.4677));
    normals.push_back(new ObjCoordinate(0.4165, 0.9072, 0.0589));
    normals.push_back(new ObjCoordinate(-0.0661, -0.9978, 0.0082));
    normals.push_back(new ObjCoordinate(0.4853, -0.6298, -0.6065));
    normals.push_back(new ObjCoordinate(0.5503, 0.7349, -0.3963));
    normals.push_back(new ObjCoordinate(0.2805, -0.8024, -0.5267));
    normals.push_back(new ObjCoordinate(0.4113, 0.2129, -0.8863));
    normals.push_back(new ObjCoordinate(0.1927, 0.934, -0.3007));
    normals.push_back(new ObjCoordinate(-0.0434, 0.9897, -0.1365));
    normals.push_back(new ObjCoordinate(0.089, -0.8303, -0.5501));
    normals.push_back(new ObjCoordinate(-0.3589, 0.8528, -0.3793));
    normals.push_back(new ObjCoordinate(-0.1366, 0.6001, -0.7882));
    normals.push_back(new ObjCoordinate(-0.0018, -1, 0.0016));
    normals.push_back(new ObjCoordinate(-0.1506, -0.941, -0.3031));
    normals.push_back(new ObjCoordinate(-0.214, 0.9687, 0.1257));
    normals.push_back(new ObjCoordinate(-0.454, 0.6495, -0.6099));
    normals.push_back(new ObjCoordinate(-0.4923, -0.3548, -0.7948));
    normals.push_back(new ObjCoordinate(-0.1313, -0.986, -0.1026));
    normals.push_back(new ObjCoordinate(-0.68, -0.5854, -0.4414));
    normals.push_back(new ObjCoordinate(-0.7424, 0.5151, -0.4284));
    normals.push_back(new ObjCoordinate(-0.9317, -0.0547, -0.3591));
    normals.push_back(new ObjCoordinate(-0.6636, 0.7388, -0.1175));
    normals.push_back(new ObjCoordinate(-0.4752, 0.878, 0.0571));
    normals.push_back(new ObjCoordinate(-0.3939, -0.9131, -0.1053));
    normals.push_back(new ObjCoordinate(-0.9664, -0.2537, -0.0413));
    normals.push_back(new ObjCoordinate(0.1258, -0.857, 0.4997));
    normals.push_back(new ObjCoordinate(0.928, 0.3724, 0.0071));
    normals.push_back(new ObjCoordinate(0.865, -0.5001, -0.0409));
    normals.push_back(new ObjCoordinate(0.0412, -0.9976, -0.0554));
    normals.push_back(new ObjCoordinate(0.2071, 0.965, 0.161));
    normals.push_back(new ObjCoordinate(-0.0763, -0.2255, -0.9712));
    normals.push_back(new ObjCoordinate(-0.3754, 0.843, -0.3853));
    faces.push_back(new ObjFace(1, 40, 9, 20));
    faces.push_back(new ObjFace(2, 1, 4, 6));
    faces.push_back(new ObjFace(3, 8, 12, 9));
    faces.push_back(new ObjFace(4, 4, 5, 10));
    faces.push_back(new ObjFace(5, 5, 3, 10));
    faces.push_back(new ObjFace(6, 7, 12, 8));
    faces.push_back(new ObjFace(7, 6, 10, 11));
    faces.push_back(new ObjFace(8, 7, 11, 12));
    faces.push_back(new ObjFace(9, 12, 20, 9));
    faces.push_back(new ObjFace(10, 10, 3, 13));
    faces.push_back(new ObjFace(11, 11, 14, 15));
    faces.push_back(new ObjFace(12, 10, 13, 14));
    faces.push_back(new ObjFace(13, 12, 15, 16));
    faces.push_back(new ObjFace(14, 3, 29, 30));
    faces.push_back(new ObjFace(15, 3, 30, 13));
    faces.push_back(new ObjFace(16, 14, 17, 18));
    faces.push_back(new ObjFace(17, 40, 20, 34));
    faces.push_back(new ObjFace(18, 30, 21, 17));
    faces.push_back(new ObjFace(19, 21, 22, 18));
    faces.push_back(new ObjFace(20, 18, 22, 23));
    faces.push_back(new ObjFace(21, 30, 24, 21));
    faces.push_back(new ObjFace(22, 20, 19, 34));
    faces.push_back(new ObjFace(23, 22, 25, 26));
    faces.push_back(new ObjFace(24, 22, 26, 23));
    faces.push_back(new ObjFace(25, 23, 27, 19));
    faces.push_back(new ObjFace(26, 24, 28, 21));
    faces.push_back(new ObjFace(27, 27, 33, 19));
    faces.push_back(new ObjFace(28, 28, 35, 25));
    faces.push_back(new ObjFace(29, 24, 36, 28));
    faces.push_back(new ObjFace(30, 32, 38, 33));
    faces.push_back(new ObjFace(31, 38, 42, 33));
    faces.push_back(new ObjFace(32, 35, 39, 31));
    faces.push_back(new ObjFace(33, 31, 37, 32));
    faces.push_back(new ObjFace(34, 36, 43, 35));
    faces.push_back(new ObjFace(35, 39, 45, 37));
    faces.push_back(new ObjFace(36, 41, 47, 36));
    faces.push_back(new ObjFace(37, 43, 44, 39));
    faces.push_back(new ObjFace(38, 42, 49, 46));
    faces.push_back(new ObjFace(39, 29, 52, 41));
    faces.push_back(new ObjFace(40, 43, 47, 48));
    faces.push_back(new ObjFace(41, 43, 48, 44));
    faces.push_back(new ObjFace(42, 49, 55, 53));
    faces.push_back(new ObjFace(43, 47, 52, 54));
    faces.push_back(new ObjFace(44, 51, 50, 55));
    faces.push_back(new ObjFace(45, 50, 54, 56));
    faces.push_back(new ObjFace(46, 54, 52, 4));
    faces.push_back(new ObjFace(47, 53, 2, 8));
    faces.push_back(new ObjFace(48, 56, 4, 1));
    faces.push_back(new ObjFace(49, 52, 3, 5));
    faces.push_back(new ObjFace(50, 1, 2, 56));
    faces.push_back(new ObjFace(51, 8, 2, 7));
    faces.push_back(new ObjFace(52, 18, 16, 15));
    faces.push_back(new ObjFace(53, 6, 4, 10));
    faces.push_back(new ObjFace(54, 7, 1, 6));
    faces.push_back(new ObjFace(55, 7, 6, 11));
    faces.push_back(new ObjFace(56, 12, 16, 20));
    faces.push_back(new ObjFace(57, 11, 10, 14));
    faces.push_back(new ObjFace(58, 12, 11, 15));
    faces.push_back(new ObjFace(59, 13, 30, 17));
    faces.push_back(new ObjFace(60, 14, 13, 17));
    faces.push_back(new ObjFace(61, 20, 16, 19));
    faces.push_back(new ObjFace(62, 15, 14, 18));
    faces.push_back(new ObjFace(63, 31, 25, 35));
    faces.push_back(new ObjFace(64, 18, 17, 21));
    faces.push_back(new ObjFace(65, 19, 18, 23));
    faces.push_back(new ObjFace(66, 22, 21, 25));
    faces.push_back(new ObjFace(67, 23, 26, 27));
    faces.push_back(new ObjFace(68, 21, 28, 25));
    faces.push_back(new ObjFace(69, 19, 33, 34));
    faces.push_back(new ObjFace(70, 27, 32, 33));
    faces.push_back(new ObjFace(71, 32, 26, 31));
    faces.push_back(new ObjFace(72, 34, 42, 46));
    faces.push_back(new ObjFace(73, 28, 36, 35));
    faces.push_back(new ObjFace(74, 41, 30, 29));
    faces.push_back(new ObjFace(75, 31, 39, 37));
    faces.push_back(new ObjFace(76, 49, 44, 51));
    faces.push_back(new ObjFace(77, 32, 37, 38));
    faces.push_back(new ObjFace(78, 24, 41, 36));
    faces.push_back(new ObjFace(79, 34, 46, 40));
    faces.push_back(new ObjFace(80, 37, 45, 38));
    faces.push_back(new ObjFace(81, 35, 43, 39));
    faces.push_back(new ObjFace(82, 38, 45, 42));
    faces.push_back(new ObjFace(83, 39, 44, 45));
    faces.push_back(new ObjFace(84, 36, 47, 43));
    faces.push_back(new ObjFace(85, 41, 52, 47));
    faces.push_back(new ObjFace(86, 42, 45, 49));
    faces.push_back(new ObjFace(87, 54, 48, 47));
    faces.push_back(new ObjFace(88, 44, 48, 51));
    faces.push_back(new ObjFace(89, 40, 46, 9));
    faces.push_back(new ObjFace(90, 46, 49, 53));
    faces.push_back(new ObjFace(91, 29, 3, 52));
    faces.push_back(new ObjFace(92, 51, 48, 50));
    faces.push_back(new ObjFace(93, 49, 51, 55));
    faces.push_back(new ObjFace(94, 9, 46, 53));
    faces.push_back(new ObjFace(95, 53, 55, 2));
    faces.push_back(new ObjFace(96, 55, 50, 56));
    faces.push_back(new ObjFace(97, 2, 55, 56));
    faces.push_back(new ObjFace(98, 56, 54, 4));
    faces.push_back(new ObjFace(99, 4, 52, 5));
    faces.push_back(new ObjFace(100, 9, 53, 8));
    faces.push_back(new ObjFace(101, 1, 7, 2));
    faces.push_back(new ObjFace(102, 18, 19, 16));
    faces.push_back(new ObjFace(103, 31, 26, 25));
    faces.push_back(new ObjFace(104, 32, 27, 26));
    faces.push_back(new ObjFace(105, 34, 33, 42));
    faces.push_back(new ObjFace(106, 41, 24, 30));
    faces.push_back(new ObjFace(107, 49, 45, 44));
    faces.push_back(new ObjFace(108, 54, 50, 48));


    int listName = vertexObjectConverter.ConvertVerticesToObject(vertex, faces, normals);

    glColor3f(Red, Green, Blue);
    glTranslatef(0, 2, 0);
    glScalef(6.2, 6.2, 6.2);
    glCallList(listName);
    glPopMatrix();

    // Delete vector data to prevent memory leaks
    for (int i = 0; i < faces.size(); i++)
        delete faces[i];
    for (int i = 0; i < normals.size(); i++)
        delete normals[i];
    for (int i = 0; i < vertex.size(); i++)
        delete vertex[i];
}

To create the object from the triangles I wrote this function:

int VertexObjectConverter::ConvertVerticesToObject(const std::vector<ObjCoordinate *> &vertex,
                                                   const std::vector<ObjFace *> &faces,
                                                   const std::vector<ObjCoordinate *> &normals) {
    int displayListName;
    displayListName = glGenLists(1);
    glNewList(displayListName, GL_COMPILE);
   //

   for (int i = 0; i < faces.size(); i++) {

        // Triangle faces
        glBegin(GL_TRIANGLES);
        glNormal3f(normals[faces[i]->facenum-1]->x,normals[faces[i]->facenum-1]->y,normals[faces[i]->facenum-1]->z);
        glVertex3f(vertex[faces[i]->faces[0]-1]->x,vertex[faces[i]->faces[0]-1]->y,vertex[faces[i]->faces[0]-1]->z);
        glVertex3f(vertex[faces[i]->faces[1]-1]->x,vertex[faces[i]->faces[1]-1]->y,vertex[faces[i]->faces[1]-1]->z);
        glVertex3f(vertex[faces[i]->faces[2]-1]->x,vertex[faces[i]->faces[2]-1]->y,vertex[faces[i]->faces[2]-1]->z);
        glEnd();

    }
    glEndList();

    return displayListName;
}

I created two structs, ObjCoordinate and ObjFace to store the vector and face information:

struct ObjCoordinate {
    float x, y, z;

    ObjCoordinate(float a, float b, float c) : x(a), y(b), z(c) {};
};

struct ObjFace {
    int facenum;
    int faces[4];
    bool four;

    ObjFace(int facen, int f1, int f2, int f3) : facenum(facen) { 
        faces[0] = f1;
        faces[1] = f2;
        faces[2] = f3;
    }

    ObjFace(int facen, int f1, int f2, int f3, int f4) : facenum(facen) { 
        faces[0] = f1;
        faces[1] = f2;
        faces[2] = f3;
        faces[3] = f4;
        four = true;
    }
};

The scene is simply rendered by calling the draw function multiple times:

/// Renders the scene
void RenderScene() {

    // Presets
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    glOrtho(-20, 20, -20, 20, -20, 20);

    // Scene Stuff
    setCameraPerspective(Perspective::ROTATE);

    // Orbit the camera around the origin
    if (rotateCamera) {

        cameraX = initCameraX * cos(theta) - initCameraY * sin(theta);
        cameraZ = initCameraX * sin(theta) + initCameraY * cos(theta);

        glTranslatef(cameraX, cameraY, cameraZ);
        gluLookAt(cameraX, cameraY, cameraZ, 0, 0, 0, 0, 1, 0);

        theta += 0.01;
        glPushMatrix();
    }

    drawCoordinateAxes();
    createLight();

    // Draw element
    MyObject.drawObject();

    // Swap buffers
    glutSwapBuffers();
}

Is there anything I am missing? What is filling up the memory? My assumption is that glCallList has something to do with it, because normal openGL object like spheres and cubes are no problem, only those custom created forms trigger that problem.


Solution

  • The memory leak happens because a new displaylist gets created (glNewList) everytime drawObject is called, but they never get deleted. A quick fix is to delete the displaylist after drawing them, but the current code suggests that there is a more fundamental problem.

    Usually, display lists should only be used when there is a list of OpenGL commands that has to be executed more than once. When a group of commands is executed only once (as in the current code), then there is no point in storing them first in a display list. In fact, this can make the code slower than it would have been without the list.

    I'd suggest to either compile the list once at startup (since the mesh seems to be static anyway) and just use this one list in every frame to draw the object. If the mesh is fully dynamic, I would remove the list at all (since it is executed only once). The last option (fully dynamic mesh, drawn more than once) would be to reuse the existing display list instead of creating a new one.

    Note, that display lists have been deprecated in OpenGL 3.0 around 2008. Unless you have to support a legacy project, using modern OpenGL should be the preferred way.