LINUX.ORG.RU

[C++] Ошибки во время выполнения при добавлении поля в классе

 


0

1

Есть класс CEllipse. Всё нормально работало до тех пор пока не добавил в его описание

std::list<int> m_Markers;
И сразу же повалило куча ошибок в консоли
class CEllipse :

	public CDrawObject

{

public:

	CEllipse(void);

	CEllipse(std::string name, int posX1, int posY1, int posX2, int posY2, int widthLine);

	~CEllipse(void);
..................
private:
std::list<int> m_Markers;
};
странною С памятью проблемы?
*** glibc detected *** ./ScadaGraphic: malloc(): smallbin double linked list corrupted: 0x08e70400 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0xe83591]
/lib/tls/i686/cmov/libc.so.6(+0x6e710)[0xe86710]
/lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x5c)[0xe87f9c]
/usr/lib/libcairo.so.2(+0x28315)[0xdc6315]
/usr/lib/libcairo.so.2(+0x495b1)[0xde75b1]
/usr/lib/libcairo.so.2(+0x2dd1f)[0xdcbd1f]
/usr/lib/libcairo.so.2(+0x2df8d)[0xdcbf8d]
/usr/lib/libcairo.so.2(+0x14ee8)[0xdb2ee8]
/usr/lib/libcairo.so.2(cairo_fill_preserve+0x2d)[0xdacf6d]
/usr/lib/libcairo.so.2(cairo_fill+0x12)[0xdacf92]
......
Из-за чего это может случится?


Попробуйте запуститься из под valgrind

Скорее всего проблема где то у Вас при работе с памятью, просто без того поля Вы попадали в свои данные а сейчас стали промахиваться. Такое часто бывает в частности при испольщовании неинициализированных переменных в адресной арифметике.

AIv ★★★★★
()

Пересобрать проект пробовали? Иногда помогает. Потому что ошибке неоткуда взяться, стало быть виноват компилятор.

amomymous ★★★
()
Ответ на: комментарий от amomymous

походу как раз в этом и проблема, удалил все .o скомпилил - нормально пока работает
надо разбраться с make, чтобы он автоматом тогда удалял obj файлы

у меня в конце него прописано
clean:
   rm -f Graph
   rm -f *.o

видмо как-то надо clean вызывать

g-71
() автор топика
Ответ на: комментарий от KblCb

> А в конструктор добавил?

Иди учи С++ двоечник и не смей больше умничать в темах по С++: дефолтные конструкторы членов класса вызываются автоматически.

anonymous
()
Ответ на: комментарий от g-71

> походу как раз в этом и проблема, удалил все .o скомпилил - нормально пока работает надо разбраться с make, чтобы он автоматом тогда удалял obj файлы

Удалять все объектные файлы? Ты видимо совсем не понимаешь смысла утилиты make. Скорее всего у тебя просто зависимости неправильно прописаны в Makefile.

anonymous
()
Ответ на: комментарий от anonymous

вот такой у меня make файл

CC=g++
LDLIBS=`pkg-config --libs gtk+-2.0 gmodule-2.0`
CFLAGS=-Wall -g `pkg-config --cflags gtk+-2.0 gmodule-2.0`

Graphic: Graphic.o DrawObject.o Rectangle.o Ellipse.o PropertiesWindow.o Polygon.o
	$(CC) $(LDLIBS) Graphic.o DrawObject.o Rectangle.o Ellipse.o PropertiesWindow.o Polygon.o -o Graphic 

Graphic.o: Graphic.cpp DrawObject.h Markers.h
	$(CC) $(CFLAGS) -c Graphic.cpp

DrawObject.o: DrawObject.cpp DrawObject.h
	$(CC) $(CFLAGS) -c DrawObject.cpp

Rectangle.o: Rectangle.cpp Rectangle.h DrawObject.h
	$(CC) $(CFLAGS) -c Rectangle.cpp

Ellipse.o: Ellipse.cpp Ellipse.h DrawObject.h
	$(CC) $(CFLAGS) -c Ellipse.cpp

PropertiesWindow.o: PropertiesWindow.cpp PropertiesWindow.h
	$(CC) $(CFLAGS) -c PropertiesWindow.cpp
	
Polygon.o: Polygon.cpp Polygon.h DrawObject.h
	$(CC) $(CFLAGS) -c Polygon.cpp		

clean:
	rm -f Graphic
	rm -f *.o

что не так? у меня всё норм работает, за исключением того, что .o файлы после компиляции не удаляются или они не должны удаляться? Потому что когда я их удалили снова скомпилил тех ошибок, которые выши уже не было. Где-то в инете было отличное руководство по make-файлам, но не могу найти ссылку :(

g-71
() автор топика
Ответ на: комментарий от KblCb

здесь конструктор абсолютно не причём имхо

g-71
() автор топика

Проблема в том, что после изменения описания класса небыли пересобраны файлы, использующие этот класс. Чтобы этого не происходило нужно правильно расписывать в мейкфайле зависимости, как сказал анон выше, тогда при изменении файла помимо него будут пересобраны и все от него зависящие. Вариант для ленивых при маленьком проекте - делать перед сборкой make clean.

iSage ★★★★
()
Ответ на: комментарий от g-71

> вот такой у меня make файл

Из Makefile можно увидеть зависимости которые ты прописал. Зависимости которые существуют на самом деле можно узнать только из исходных файлов.

anonymous
()
Ответ на: комментарий от g-71

> у меня всё норм работает, за исключением того, что .o файлы после компиляции не удаляются или они не должны удаляться?

Если ты их будешь удалять, то в следующий раз все файлы будут пересобираться заново вместо того чтобы пересобрать только необходимые.

anonymous
()
Ответ на: комментарий от anonymous

т.е. например у меня есть херед класса CRectagle

у меня в начале идут инклуды

#include "DrawObject.h"

#include "Marker.h"

значит я в зависимостях пишу:

Rectangle.o: Rectangle.cpp Rectangle.h Marker.h DrawObject.h
$(CC) $(CFLAGS) -c Rectangle.cpp

g-71
() автор топика
Ответ на: комментарий от g-71

>за исключением того, что .o файлы после компиляции не удаляются или они не должны удаляться?
не должны.

видмо как-то надо clean вызывать

$ make clean

xydo ★★
()
Ответ на: комментарий от g-71

Что только не делают, лишь бы не использовать нормальные системы сборки.

kamre ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.