Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти при использовании xlib window и cairo  (Прочитано 4781 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 19-08-2009 15:20 » 

valgrind xlib window & cairo

valgrind постоянно ругается, на утечку памяти:
Код:
#include "xlib_cairo_window.h"
//#include <cairo.h>
//#include <X11/Xlib.h>
#include <iostream>
using std::cout;
using std::endl;

point xlib_window::current() { return p; }
void xlib_window::current(const point& cp) { p=cp; }
void xlib_window::line(const point& p) { if (p.x) cout<<"px"<<endl; }
void xlib_window::paint() {
XEvent e;
while(1) {
XNextEvent(dpy, &e);
if(e.type==Expose && e.xexpose.count<1) {
//paint(cs);
} else if(e.type==ButtonPress) break;
}
}

xlib_window::xlib_window(int x,int y,const char* pc):p(0,0){
if(!(dpy=XOpenDisplay(NULL))) {
std::cerr<<"ERROR: Could not open display"<<std::endl;
exit(1);
}
scr=DefaultScreen(dpy);
rootwin=RootWindow(dpy, scr);

win=XCreateSimpleWindow(dpy, rootwin, 1, 1, x, y, 0,
BlackPixel(dpy, scr), BlackPixel(dpy, scr));
XStoreName(dpy, win, pc);
XSelectInput(dpy, win, ExposureMask|ButtonPressMask);
XMapWindow(dpy, win);
   surface=cairo_xlib_surface_create(dpy, win,
DefaultVisual(dpy, 0), x, y);
        cr = cairo_create (surface);

        cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
        cairo_set_font_size (cr, 32.0);
        cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
        cairo_move_to (cr, 10.0, 50.0);
        cairo_show_text (cr, "Hello, world");
cairo_show_page(cr);

}

xlib_window::~xlib_window(){
        cairo_destroy (cr);
        cairo_surface_destroy (surface);
XCloseDisplay(dpy);
cout<<"destroing xlib window"<<endl;
}

вроде бы разрушил все созданые в конструкторе объекты, может быть следовало обработать еще какое-нить сообщение в пайнт?

или может кто-нить более опытным глазом увидит, еще какой объект, который  я не вспомнил в деструкторе?
« Последнее редактирование: 20-08-2009 02:45 от LogRus » Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 20-08-2009 02:32 » 

объявление покажи

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

и тему я переименовал ибо она не о чём, постарайся называть темы по русски, а то потом её не поиском не найти, ни понять что в ней обсуждается.
« Последнее редактирование: 20-08-2009 02:46 от LogRus » Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 20-08-2009 13:50 » 

Код:
struct point {
int x;
int y;
point(int a,int b) : x(a),y(b) { } ;
};
#include <iostream>
using std::cout;
using std::endl;
class window {
public:
virtual point current() =0 ;
virtual void current(const point& p) = 0;
virtual void line(const point& p) =0;
virtual void paint()=0;
virtual ~window() {
cout<<"destroing abstract window"<<endl;
};
};

#include<cairo-xlib.h>
class xlib_window : public window {
Display *dpy;
Window rootwin;
Window win;
int scr;
cairo_t *cr;
cairo_surface_t *surface;
point p;
public:
xlib_window(int x=500,int y=300,const char* pc="hello");
virtual point current();
virtual void current(const point& cp);
virtual void line(const point& p) ;
virtual void paint();
virtual ~xlib_window();
};

объявление xlib_window?

честно говоря проблемма не в коде, а в непонимании работы каиро и хлиб - выдрал код из туториала cairo png, заменил открыитие png файла в одном туториале на инициализацию xlib из другого туториала - почему заработала ( в смысле продолжила выводить текст в экран как в файл ) до сих пор удивляюсь

да с наименованием тем у меня определенные трудности, особенно когда я несколько часов подряд над кодом медитирую Улыбаюсь  только седня начал отходить и подумывать, что вместо valgrind нужно было чето про вероятную утечку памяти спрашивать Улыбаюсь


Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 21-08-2009 02:42 » 

memprof поставь, он мне немного больше нравится для поиска утечек, наверное из-за GUI Улыбаюсь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines