Commit 8daf658a by Szeberényi Imre

v0

parents
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="SDL_alakzat" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/SDL_alakzat" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
<Add option="-DMEMTRACE" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/SDL_alakzat" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add directory="$(#sdl.include)" />
</Compiler>
<Linker>
<Add library="mingw32" />
<Add library="SDLmain" />
<Add library="SDL.dll" />
<Add library="user32" />
<Add library="gdi32" />
<Add library="winmm" />
<Add library="dxguid" />
<Add library="SDL_gfx" />
<Add library="SDL_image" />
<Add library="SDL_ttf" />
<Add directory="$(#sdl.lib)" />
</Linker>
<Unit filename="alakzat.cpp" />
<Unit filename="alakzat.h" />
<Unit filename="kor.cpp" />
<Unit filename="kor.h" />
<Unit filename="main.cpp" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Unit filename="pont.h" />
<Unit filename="szakasz.cpp" />
<Unit filename="szakasz.h" />
<Unit filename="szin.h" />
<Extensions>
<code_completion />
<debugger />
<envvars />
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* \file alakzat.cpp
* Alakzat osztály tagfüggvényeinek megvalósítása
*/
#include "alakzat.h"
SDL_Surface* Alakzat::scr; /// statikus tag létrehozása
/// mozgat - eltolja az alakzat origóját
/// @param d - eltolás
void Alakzat::mozgat(const Pont& d) {
Szin tsz = sz; /// tényleges rajzolási szín elmentése
sz = BACKGND; /// rajzolási szín legyen a háttér színe
rajzol(); /// A vonal letörlés az eredeti helyről
p0 += d; /// mozgatás: a pozíció változik
sz = tsz; /// rajzolási szín a tényleges szín
rajzol(); /// A vonal felrajzolása az új pozícióra
}
/**
* \file alakzat.h
* Alakzat alaposztály deklarációja
*/
#ifndef ALAKZAT_H
#define ALAKZAT_H
#include <SDL.h>
#include <SDL_gfxPrimitives.h>
#include "pont.h"
#include "szin.h"
/// Alakzat absztrakt osztály
/// statikus tagként tárolja az SDL surface pointert
class Alakzat {
protected:
Pont p0; ///< alakzat origója
Szin sz; ///< alakzat színe
static SDL_Surface *scr; ///< eldugott globális változó
public:
/// Konstruktor
/// @param p0 - kezdőpont
/// @param sz - szín és átlátszóság
Alakzat(const Pont& p0, const Szin& sz) :p0(p0), sz(sz) {}
/// Pozíció lekérdezése
/// @return alakzat origója
const Pont& getp0() const { return p0; }
/// suface beállítása
/// @param s - SDL surface
static void setSurface(SDL_Surface* s) { scr = s; }
/// rajzol
virtual void rajzol() const = 0; // tisztán virtuális
/// mozgat: origóját eltolja az új pontba
/// @param d - eltolás vektora
void mozgat(const Pont& d);
/// Destruktor
/// Ebben az alaposztályban nincs mit tennie, mivel nem tartalmaz
/// dinamikus adattagot az alaposztály, de származtatottban még lehet.
virtual ~Alakzat() {}
};
#endif // ALAKZAT_H
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<zoom_level>10</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>140</x>
<y>40</y>
<w>320</w>
<h>220</h>
</coordinates>
<panel_attributes>/Alakzat/
--
_# scr: SDL_Surface*_
# p0: Pont
# sz: Szin
--
+ Alakzat(Pont&amp;, Szin&amp;)
/+ virtual Rajzol(): void/
+ Mozgat(): void
_+ setSurface(SDL_Surface*): Void_
/+ virtual ~Alakzat()/</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>320</x>
<y>380</y>
<w>310</w>
<h>140</h>
</coordinates>
<panel_attributes>Szakasz
--
- pv: Pont
--
+ Szakasz(Pont&amp;, Pont&amp;, Szin&amp;)
+ Szakasz(Pont&amp;, int, int)
+ Rajzol(): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>70</x>
<y>380</y>
<w>230</w>
<h>140</h>
</coordinates>
<panel_attributes>Kor
--
- r: int
--
+ Kor(Pont&amp;, int, Szin&amp;)
+ Rajzol(): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>170</x>
<y>250</y>
<w>100</w>
<h>150</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>80.0;10.0;10.0;130.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>310</x>
<y>250</y>
<w>150</w>
<h>150</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;130.0;130.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>540</x>
<y>20</y>
<w>310</w>
<h>180</h>
</coordinates>
<panel_attributes>Szin
--
+ r: Uint8
+ g: Uint8
+ b: Uint8
+ a: Uint8
--
+ Szin(Uint8, Uint8, Uint8, Uint8)
+ operator Unit32()</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>540</x>
<y>210</y>
<w>310</w>
<h>160</h>
</coordinates>
<panel_attributes>Pont
--
+ x: int
+ y: int
--
+ Pont(int, int)
+ operator+=(Pont): Pont&amp;
+ operator-(Pont): Pont</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>450</x>
<y>70</y>
<w>110</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;90.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>450</x>
<y>190</y>
<w>110</w>
<h>50</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-
</panel_attributes>
<additional_attributes>10.0;30.0;90.0;30.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>620</x>
<y>360</y>
<w>110</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;60.0;90.0;60.0;90.0;10.0</additional_attributes>
</element>
</diagram>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<zoom_level>10</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>130</x>
<y>40</y>
<w>240</w>
<h>230</h>
</coordinates>
<panel_attributes>/Alakzat/
--
# x: int
# y: int
# szin: int
--
+ Alakzat(int, int, int)
/+ virtual Rajzol(): void/
+ Mozgat(int, int): void
/+ virtual ~Alakzat()/</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>10</x>
<y>330</y>
<w>230</w>
<h>160</h>
</coordinates>
<panel_attributes>Szakasz
--
- xv: int
- yv: int
--
+ Szakasz(int, int, int, int, int)
+ rajzol(): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>270</x>
<y>330</y>
<w>230</w>
<h>160</h>
</coordinates>
<panel_attributes>Teglalap
--
- xc: int
- yc: int
--
+ Teglalap(int, int, int, int, int)
+ rajzol(): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>90</x>
<y>240</y>
<w>160</w>
<h>110</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>140;30;30;90</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>240</x>
<y>240</y>
<w>170</w>
<h>110</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>30;30;150;90</additional_attributes>
</element>
</diagram>
This source diff could not be displayed because it is too large. You can view the blob instead.
/**
* \file kor.cpp
* Kor osztály tagfüggvényeinek megvalósítása
*/
#include "kor.h"
/// Kört rajzoló rajzol fv.
void Kor::rajzol() const {
filledCircleColor(scr, p0.x, p0.y, r, sz);
SDL_Flip(scr); /// nem a legjobb megoldás a villogás miatt, de most elmegy
}
/**
* \file kor.h
* Kor osztály deklarációja
*/
#ifndef KOR_H
#define KOR_H
#include "alakzat.h"
/// Kor osztály
class Kor : public Alakzat {
int r; ///< sugár
public:
/// Konstruktor
/// @param p0 - kezdőpont
/// @param r - sugár
/// @param sz - szín és átlátszóság
Kor(const Pont& p0, int r, Szin sz)
:Alakzat(p0, sz), r(r) /// Ős osztály inic
{}
/// kört rajzol
void rajzol() const;
};
#endif // KOR_H
/**
* \file main.cpp
* Bugyuta demó az SDL-lel kombinált alakzat osztályok kipróbálására.
* Felrajzol pár alakzatot, melyek az egérmozgással együtt mozognak.
* (csak az irányt követik, nem a mozgás nagyságát)
*/
#include <iostream>
#include <fstream>
#include "memtrace.h"
#include "szakasz.h"
#include "kor.h"
/// segédfüggvény az egérmozgáshoz
/// @param x - relatív elmozdulás
/// @return -1, 0, vagy 1 az elmozdulás irányától függően
inline int delta(int x) {
#ifdef DEMO
return 0;
#else
return x == 0 ? 0 : x < 0 ? -1 : 1;
#endif // DEMO
}
/// segédfüggvény az SDL inicializálásához
/// @return suface pointer vagy 0
SDL_Surface* init() {
if (SDL_Init( SDL_INIT_VIDEO ) < 0)
return NULL;
/// SDL jelen változata lezárja a szabványos kimeneteteket.
/// Ezért újra kinyitjuk, hogy látszódjanak a konzolon a debug kiírások
std::freopen( "CON", "w", stdout );
std::freopen( "CON", "w", stderr );
return SDL_SetVideoMode(1024, 768, 0, SDL_ANYFORMAT);
}
int main(int argc, char* argv[]) {
SDL_Surface* screen = init();
if (screen == NULL) {
std::cerr << "Nem sikerult az SDL INIT: " << SDL_GetError() << std::endl;
return 1;
}
Alakzat::setSurface(screen); // screen letárolása az "Alakzat-ba"
const int N = 100; // max 100 alakzatunk lehet
Alakzat *idom[N];
int db = 0; // most nincs egy se
/// felrajzolunk egy szakaszt és egy kört
#ifndef DEMO
idom[db++] = new Szakasz(Pont(20,40), 100, 0, WHITE);
idom[db++] = new Kor(Pont(120,140), 50, BLUE);
#endif
/// Eseménykezelõ ciklus.
SDL_Event ev;
while (SDL_WaitEvent(&ev) && ev.type != SDL_QUIT) {
switch (ev.type) {
case SDL_MOUSEMOTION: { // egérmozgás esemény
int dx = delta(ev.motion.xrel); // merre mozdult ?
int dy = delta(ev.motion.yrel);
for (int i = 0; i < db; i++) { // végigmegyünk az összesen
idom[i]->mozgat(Pont(dx, dy)); // kicsit mozdítunk rajta
idom[i]->rajzol(); // kirajzoljuk
}
break;
}
case SDL_MOUSEBUTTONDOWN: // egérgomb kezelése
if (db < N) {
if (ev.button.button == SDL_BUTTON_LEFT)
idom[db] = new Szakasz(Pont(ev.button.x, ev.button.y),
40, 80, GREEN);
else
idom[db] = new Kor(Pont(ev.button.x, ev.button.y), 40, RED);
idom[db]->rajzol();
++db;
}
break;
}
}
for (int i = 0; i < db; i++) /// fel kell szabadítani minden objektumot
delete idom[i];
SDL_Quit();
/// SDL mellékhatása, hogy közvetlenül meg kell hívni a memtrace ellenőrző
/// funkcióját (exit ágon azért is lezárja a standard hibakimenetet).
memtrace::mem_check();
return 0;
}
/*********************************
Memoriaszivargas-detektor
Keszitette: Peregi Tamas, BME IIT, 2011
petamas@iit.bme.hu
Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018. 2019.
singleton: 2019.
*********************************/
#ifndef MEMTRACE_H
#define MEMTRACE_H
#if defined(MEMTRACE)
/*ha definiálva van, akkor a hibakat ebbe a fajlba írja, egyébkent stderr-re*/
/*#define MEMTRACE_ERRFILE MEMTRACE.ERR*/
/*ha definialva van, akkor futas kozben lancolt listat epit. Javasolt a hasznalata*/
#define MEMTRACE_TO_MEMORY
/*ha definialva van, akkor futas kozben fajlba irja a foglalasokat*/
/*ekkor nincs ellenorzes, csak naplozas*/
/*#define MEMTRACE_TO_FILE*/
/*ha definialva van, akkor a megallaskor automatikus riport keszul */
#define MEMTRACE_AUTO
/*ha definialva van, akkor malloc()/calloc()/realloc()/free() kovetve lesz*/
#define MEMTRACE_C
#ifdef MEMTRACE_C
/*ha definialva van, akkor free(NULL) nem okoz hibat*/
#define ALLOW_FREE_NULL
#endif
#ifdef __cplusplus
/*ha definialva van, akkor new/delete/new[]/delete[] kovetve lesz*/
#define MEMTRACE_CPP
#endif
#if defined(__cplusplus) && defined(MEMTRACE_TO_MEMORY)
/*ha definialva van, akkor atexit helyett objektumot hasznal*/
/*ajanlott bekapcsolni*/
#define USE_ATEXIT_OBJECT
#endif
/******************************************/
/* INNEN NE MODOSITSD */
/******************************************/
#ifdef NO_MEMTRACE_TO_FILE
#undef MEMTRACE_TO_FILE
#endif
#ifdef NO_MEMTRACE_TO_MEMORY
#undef MEMTRACE_TO_MEMORY
#endif
#ifndef MEMTRACE_AUTO
#undef USE_ATEXIT_OBJECT
#endif
#ifdef __cplusplus
#define START_NAMESPACE namespace memtrace {
#define END_NAMESPACE } /*namespace*/
#define TRACEC(func) memtrace::func
#include <new>
#else
#define START_NAMESPACE
#define END_NAMESPACE
#define TRACEC(func) func
#endif
// THROW deklaráció változatai
#if defined(_MSC_VER)
// VS rosszul kezeli az __cplusplus makrot
#if _MSC_VER < 1900
// * nem biztos, hogy jó így *
#define THROW_BADALLOC
#define THROW_NOTHING
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#else
#if __cplusplus < 201103L
// C++2003 vagy régebbi
#define THROW_BADALLOC throw (std::bad_alloc)
#define THROW_NOTHING throw ()
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#endif
START_NAMESPACE
int allocated_blocks();
END_NAMESPACE
#if defined(MEMTRACE_TO_MEMORY)
START_NAMESPACE
int mem_check(void);
END_NAMESPACE
#endif
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
#include <cstdio>
START_NAMESPACE
class atexit_class {
private:
atexit_class() {
#if defined(CPORTA) && !defined(CPORTA_NOSETBUF)
setbuf(stdout, 0);
setbuf(stderr, 0);
#endif
}
public:
static atexit_class& get_atexit_obj() {
static atexit_class instance; // singleton példány
return instance;
}
int check() {
return mem_check();
}
~atexit_class() {
check();
}
};
/// A statikus referencia minden fordítási egységben keletkezik, de
/// mindegyik egyetlen példányra fog hivatkozni a singleton minta miatt
static atexit_class& atexit_obj = atexit_class::get_atexit_obj();
END_NAMESPACE
#endif/*MEMTRACE_TO_MEMORY && USE_ATEXIT_OBJECT*/
/*Innentol csak a "normal" include eseten kell, kulonben osszezavarja a mukodest*/
#ifndef FROM_MEMTRACE_CPP
#include <stdlib.h>
#ifdef __cplusplus
#include <iostream>
/* ide gyűjtjük a nemtrace-vel összeakadó headereket, hogy előbb legyenek */
#include <fstream> // VS 2013 headerjében van deleted definició
#include <sstream>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <functional>
#endif
#ifdef MEMTRACE_CPP
namespace std {
typedef void (*new_handler)();
}
#endif
#ifdef MEMTRACE_C
START_NAMESPACE
#undef malloc
#define malloc(size) TRACEC(traced_malloc)(size,#size,__LINE__,__FILE__)
void * traced_malloc(size_t size, const char *size_txt, int line, const char * file);
#undef calloc
#define calloc(count,size) TRACEC(traced_calloc)(count, size, #count","#size,__LINE__,__FILE__)
void * traced_calloc(size_t count, size_t size, const char *size_txt, int line, const char * file);
#undef free
#define free(p) TRACEC(traced_free)(p, #p,__LINE__,__FILE__)
void traced_free(void * p, const char *size_txt, int line, const char * file);
#undef realloc
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size, FILE* fp);
END_NAMESPACE
#endif/*MEMTRACE_C*/
#ifdef MEMTRACE_CPP
START_NAMESPACE
#undef set_new_handler
#define set_new_handler(f) TRACEC(_set_new_handler)(f)
void _set_new_handler(std::new_handler h);
void set_delete_call(int line, const char * file);
END_NAMESPACE
void * operator new(size_t size, int line, const char * file) THROW_BADALLOC;
void * operator new[](size_t size, int line, const char * file) THROW_BADALLOC;
void * operator new(size_t size) THROW_BADALLOC;
void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING;
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING;
#define new new(__LINE__, __FILE__)
#define delete memtrace::set_delete_call(__LINE__, __FILE__),delete
#ifdef CPORTA
#define system(...) // system(__VA_ARGS__)
#endif
#endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/
#endif /*MEMCHECK*/
#endif /*MEMTRACE_H*/
/**
* \file pont.h
* Pont osztály deklarációja
*/
#ifndef PONT_H
#define PONT_H
/// Pont osztály
/// Az egyszerűség kedvéért minden tagja publikus.
/// Igy nem kell getter, meg setter.
/// Csak azok az operatorok lettek megvalósítva, melyeket használ a demo
struct Pont {
int x;
int y;
Pont(int x = 0, int y = 0) :x(x), y(y) {}
/// += operator
Pont& operator+=(const Pont& rhs_p) {
x += rhs_p.x;
y += rhs_p.y;
return *this;
}
/// - operator
Pont operator-(const Pont& rhs_p) const {
return Pont(rhs_p.x-x, rhs_p.y-y);
}
};
#endif // PONT_H
/**
* \file szakasz.cpp
* Szakasz osztály tagfüggvényeinek megvalósítása
*/
#include "szakasz.h"
/// Szakaszt rajzoló rajzol fv.
void Szakasz::rajzol() const {
thickLineColor(scr, p0.x, p0.y, pv.x+p0.x, pv.y+p0.y, 3, sz);
SDL_Flip(scr); /// nem a legjobb megoldás a villogás miatt, de most elmegy
}
/**
* \file szakasz.h
* Szakasz osztály deklarációja
*/
#ifndef SZAKASZ_H
#define SZAKASZ_H
#include "alakzat.h"
/// Szakasz osztály
class Szakasz : public Alakzat {
Pont pv; ///< szakasz végpontja az origóhoz képest
public:
/// konstruktor 2 pontból
/// @param p0 - kezdőpont
/// @param pv - végpont
/// @param sz - szín és átlátszóság
Szakasz(const Pont& p0, const Pont& pv, Szin sz)
: Alakzat(p0, sz), pv(p0-pv) { }
/// konstruktor 1 pontból és 2 hosszból
/// @param p0 - kezdőpont
/// @param xl - x irányú hossz
/// @param yl - y irányú hossz
/// @param sz - szín és átlátszóság
Szakasz(const Pont& p0, int xl, int yl, Szin sz)
: Alakzat(p0, sz), pv(Pont(xl, yl)) { }
/// szakaszt rajzol
void rajzol() const ; // átdefiniáljuk a virt. fv-t.
};
#endif // SZAKASZ_H
/**
* \file szin.h
* Szín osztály deklarációja
*/
#ifndef SZIN_H
#define SZIN_H
/// Szín osztály
/// Az egyszerűség kedvéért minden tagja publikus.
/// Így nem kell getter, meg setter, bár ronda megoldás.
struct Szin {
Uint8 r, g, b; ///< RGB
Uint8 a; ///< átlátszóság
///
/// @param r - red
/// @param g - green
/// @param b - blue
/// @param a - transparency
Szin(Uint8 r = 0, Uint8 g = 0, Uint8 b = 0, Uint8 a = 255)
:r(r), g(g), b(b), a(a) {}
/// cast Uint32-re
operator Uint32() const { return (r << 24) + (g << 16) + (b << 8) + a; }
};
/// Színkontsansok
const Szin BLACK(0,0,0);
const Szin WHITE(255,255,255);
const Szin RED(255,0,0);
const Szin GREEN(0,255,0);
const Szin BLUE(0,0,255);
const Szin BACKGND = BLACK;
#endif // SZIN_H
# Makefile az othhonMegMukodott peldaprogram forditasara es futtatasara
# Solaris (ural2) es Linux ala.
#
# Hasznalat:
# make
# legeneralja mindket valtozatot
# make run
# futtatja mindket valtozatot
src = main.cpp
prog1 = nemVirtDestr
prog2 = virtDestr
targets = $(prog1) $(prog2)
CXX = g++ # # a C++ fordito neve
CXXFLAGS = -pedantic -Wall # # C++ kapcsolok: legyen bobeszedu,
CXXFLAGS += -g # # ... es legyen debug info is
.PHONY: all
all: $(targets)
$(prog1): $(src)
$(CXX) -DVIRTUAL= $(src) -o $@
$(prog2): $(src0)
$(CXX) -DVIRTUAL=virtual $(src) -o $@
.PHONY: run
run: $(targets)
@echo "Virtualis destruktorral 70 elem:"
(ulimit -d 20; ./virtDestr 70)
@echo
@echo "Virtualis destruktor nelkul 70 elem:"
(ulimit -d 20; ./nemVirtDestr 70)
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(targets)
#include <iostream>
#include <cstdlib>
#ifndef VIRT // ha nem definiált akkor üres lesz
# define VIRT
#endif // VIRT
struct A {
VIRT ~A() {
std::cout << '.';
};
};
class B :public A {
char *p;
public:
B() { p=new char[1000];}
~B() { delete[] p; }
};
int main(int argc, char *argv[]) {
int num = 20;
if (argc > 1)
num = atoi(argv[1]);
for (int i = 0; i < num; i++) {
A *pa = new B;
delete pa;
}
std::cout << "\nVege" << std::endl;
return 0;
}
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="otthonMegMukodott" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/virt_destruktor" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/virt_destruktor" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
<Add option="-DMEMTRACE" />
</Compiler>
<Unit filename="main.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
#include "memtrace.h"
#define virtual
struct A {
virtual ~A() {};
};
class B :public A {
char *p;
public:
B() { p=new char[10];}
~B() { delete[] p; }
};
int main() {
A *pa = new B;
delete pa;
return 0;
}
/*********************************
Memoriaszivargas-detektor
Keszitette: Peregi Tamas, BME IIT, 2011
petamas@iit.bme.hu
Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018. 2019.
*********************************/
#ifndef MEMTRACE_H
#define MEMTRACE_H
#if defined(MEMTRACE)
/*ha definiálva van, akkor a hibakat ebbe a fajlba írja, egyébkent stderr-re*/
/*#define MEMTRACE_ERRFILE MEMTRACE.ERR*/
/*ha definialva van, akkor futas kozben lancolt listat epit. Javasolt a hasznalata*/
#define MEMTRACE_TO_MEMORY
/*ha definialva van, akkor futas kozben fajlba irja a foglalasokat*/
/*ekkor nincs ellenorzes, csak naplozas*/
/*#define MEMTRACE_TO_FILE*/
/*ha definialva van, akkor a megallaskor automatikus riport keszul */
#define MEMTRACE_AUTO
/*ha definialva van, akkor malloc()/calloc()/realloc()/free() kovetve lesz*/
#define MEMTRACE_C
#ifdef MEMTRACE_C
/*ha definialva van, akkor free(NULL) nem okoz hibat*/
#define ALLOW_FREE_NULL
#endif
#ifdef __cplusplus
/*ha definialva van, akkor new/delete/new[]/delete[] kovetve lesz*/
#define MEMTRACE_CPP
#endif
#if defined(__cplusplus) && defined(MEMTRACE_TO_MEMORY)
/*ha definialva van, akkor atexit helyett objektumot hasznal*/
/*ajanlott bekapcsolni*/
#define USE_ATEXIT_OBJECT
#endif
/******************************************/
/* INNEN NE MODOSITSD */
/******************************************/
#ifdef NO_MEMTRACE_TO_FILE
#undef MEMTRACE_TO_FILE
#endif
#ifdef NO_MEMTRACE_TO_MEMORY
#undef MEMTRACE_TO_MEMORY
#endif
#ifndef MEMTRACE_AUTO
#undef USE_ATEXIT_OBJECT
#endif
#ifdef __cplusplus
#define START_NAMESPACE namespace memtrace {
#define END_NAMESPACE } /*namespace*/
#define TRACEC(func) memtrace::func
#include <new>
#else
#define START_NAMESPACE
#define END_NAMESPACE
#define TRACEC(func) func
#endif
// THROW deklaráció változatai
#if defined(_MSC_VER)
// VS rosszul kezeli az __cplusplus makrot
#if _MSC_VER < 1900
// * nem biztos, hogy jó így *
#define THROW_BADALLOC
#define THROW_NOTHING
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#else
#if __cplusplus < 201103L
// C++2003 vagy régebbi
#define THROW_BADALLOC throw (std::bad_alloc)
#define THROW_NOTHING throw ()
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#endif
START_NAMESPACE
int allocated_blocks();
END_NAMESPACE
#if defined(MEMTRACE_TO_MEMORY)
START_NAMESPACE
int mem_check(void);
END_NAMESPACE
#endif
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
#include <cstdio>
START_NAMESPACE
class atexit_class {
private:
static int counter;
static int err;
public:
atexit_class() {
#if defined(CPORTA) && !defined(CPORTA_NOSETBUF)
if (counter == 0) {
setbuf(stdout, 0);
setbuf(stderr, 0);
}
#endif
counter++;
}
int check() {
if(--counter == 0)
err = mem_check();
return err;
}
~atexit_class() {
check();
}
};
static atexit_class atexit_obj;
END_NAMESPACE
#endif/*MEMTRACE_TO_MEMORY && USE_ATEXIT_OBJECT*/
/*Innentol csak a "normal" include eseten kell, kulonben osszezavarja a mukodest*/
#ifndef FROM_MEMTRACE_CPP
#include <stdlib.h>
#ifdef __cplusplus
#include <iostream>
/* ide gyűjtjük a nemtrace-vel összeakadó headereket, hogy előbb legyenek */
#include <fstream> // VS 2013 headerjében van deleted definició
#include <sstream>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <functional>
#endif
#ifdef MEMTRACE_CPP
namespace std {
typedef void (*new_handler)();
}
#endif
#ifdef MEMTRACE_C
START_NAMESPACE
#undef malloc
#define malloc(size) TRACEC(traced_malloc)(size,#size,__LINE__,__FILE__)
void * traced_malloc(size_t size, const char *size_txt, int line, const char * file);
#undef calloc
#define calloc(count,size) TRACEC(traced_calloc)(count, size, #count","#size,__LINE__,__FILE__)
void * traced_calloc(size_t count, size_t size, const char *size_txt, int line, const char * file);
#undef free
#define free(p) TRACEC(traced_free)(p, #p,__LINE__,__FILE__)
void traced_free(void * p, const char *size_txt, int line, const char * file);
#undef realloc
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size, FILE* fp);
END_NAMESPACE
#endif/*MEMTRACE_C*/
#ifdef MEMTRACE_CPP
START_NAMESPACE
#undef set_new_handler
#define set_new_handler(f) TRACEC(_set_new_handler)(f)
void _set_new_handler(std::new_handler h);
void set_delete_call(int line, const char * file);
END_NAMESPACE
void * operator new(size_t size, int line, const char * file) THROW_BADALLOC;
void * operator new[](size_t size, int line, const char * file) THROW_BADALLOC;
void * operator new(size_t size) THROW_BADALLOC;
void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING;
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING;
#define new new(__LINE__, __FILE__)
#define delete memtrace::set_delete_call(__LINE__, __FILE__),delete
#ifdef CPORTA
#define system(...) // system(__VA_ARGS__)
#endif
#endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/
#endif /*MEMCHECK*/
#endif /*MEMTRACE_H*/
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="virt_destruktor" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/virt_destruktor" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/virt_destruktor" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
<Add option="-DMEMTRACE" />
</Compiler>
<Unit filename="main.cpp" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment