Утечка памяти в glCallList - PullRequest
0 голосов
/ 23 мая 2018

Я создаю 3D-объект, создавая glCallList с векторами, гранями и нормальными векторами.Даже после того, как я удаляю все элементы векторов после использования, я заметил, что память заполняется, пока система не зависнет.Я уже проанализировал приложение с помощью valgrind, но не заметил ничего проблемного.Например, здесь я создаю трехмерный объект:

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];
}

Чтобы создать объект из треугольников, я написал эту функцию:

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;
}

Я создал две структуры, ObjCoordinate и ObjFace, чтобы сохранить вектор и информацию о лице:

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;
    }
};

Сцена просто визуализируется путем многократного вызова функции рисования:

/// 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();
}

Есть ли что-то, что мне не хватает?Что заполняет память?Я предполагаю, что glCallList как-то связан с этим, потому что нормальные объекты openGL, такие как сферы и кубы, не являются проблемой, только эти пользовательские формы вызывают эту проблему.

1 Ответ

0 голосов
/ 24 мая 2018

Утечка памяти происходит из-за того, что при каждом вызове drawObject создается новый список отображения (glNewList), но они никогда не удаляются.Быстрое решение состоит в том, чтобы удалить список отображения после их отрисовки, но текущий код предполагает, что существует более фундаментальная проблема.

Обычно списки отображения следует использовать только тогда, когда существует список команд OpenGL, который долженисполняться более одного раза .Когда группа команд выполняется только один раз (как в текущем коде), нет смысла сохранять их сначала в списке отображения.Фактически, это может сделать код медленнее, чем это было бы без списка.

Я бы предложил либо скомпилировать список один раз при запуске (поскольку сетка в любом случае кажется статической), и просто использовать этоодин список в каждом кадре для рисования объекта.Если сетка полностью динамическая, я бы вообще удалил список (так как он выполняется только один раз).Последний вариант (полностью динамическая сетка, нарисованная более одного раза) будет состоять в том, чтобы повторно использовать существующий список отображения вместо создания нового.

Обратите внимание, что списки отображения были устаревшими в OpenGL 3.0 примерно в 2008 году.Если вам не нужно поддерживать унаследованный проект, предпочтительнее использовать современный OpenGL.

...