Commit e01d2e5e by Szeberényi Imre

kommentek

parent 8daf658a
/*
* Demonstrációs program tipikus hibára, ami memória szivárgást okoz.
* A hiba UNIX/LINUX környezetben demonstrálható könnyen, mivel ott a
* futtatandó program heap használata könnyen korlátozható.
* Fordítás: make
* Két program készül: virtDestr és nemVirtDestr
* Futtatás: make run
* Futtatáskor korlátozzuk a heap méretét ami a nemVirtDestr változatnak nem elég
*/
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#ifndef VIRT // ha nem definiált akkor üres lesz /// A VIRTUAL makró vagy üres, vagy virtual kulcsszót tartalmaz
# define VIRT #ifndef VIRTUAL // ha nem definiált akkor üres lesz
#endif // VIRT # define VIRTUAL
#endif // VIRTUAL
struct A { struct A {
VIRT ~A() { VIRTUAL ~A() {
std::cout << '.'; std::cout << '.';
}; };
}; };
/// Amennyiben az alaposztály destruktora nem virtuális,
/// akkor nem fog meghívódni a származtatott osztály destruktora.
class B :public A { class B :public A {
char *p; char *p;
public: public:
B() { p=new char[1000];} B() { p=new char[1000];}
~B() { delete[] p; } ~B() { delete[] p; std::cout << '*'; }
}; };
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
...@@ -25,7 +38,9 @@ int main(int argc, char *argv[]) { ...@@ -25,7 +38,9 @@ int main(int argc, char *argv[]) {
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
A *pa = new B; A *pa = new B;
delete pa; delete pa; /// B példányát alaposztály típusú pointeren keresztül érjük el.
/// Ezért csak az alaposztály destruktora hívódik, ha az nem
/// virtuális.
} }
std::cout << "\nVege" << std::endl; std::cout << "\nVege" << std::endl;
return 0; return 0;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<Option compiler="gcc" /> <Option compiler="gcc" />
<Build> <Build>
<Target title="Debug"> <Target title="Debug">
<Option output="bin/Debug/virt_destruktor" prefix_auto="1" extension_auto="1" /> <Option output="bin/Debug/otthonMegMukodott" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" /> <Option object_output="obj/Debug/" />
<Option type="1" /> <Option type="1" />
<Option compiler="gcc" /> <Option compiler="gcc" />
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</Compiler> </Compiler>
</Target> </Target>
<Target title="Release"> <Target title="Release">
<Option output="bin/Release/virt_destruktor" prefix_auto="1" extension_auto="1" /> <Option output="bin/Release/otthonMegMukodott" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" /> <Option object_output="obj/Release/" />
<Option type="1" /> <Option type="1" />
<Option compiler="gcc" /> <Option compiler="gcc" />
......
# 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"
./virtDestr
@echo
@echo "Virtualis destruktor nelkul"
./nemVirtDestr
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(targets)
/*
* Demonstrációs program virtualis destruktor működésére.
* Az alaposztály destruktora a VIRTUAL makrótól függően
* virtuális, vagy nem.
* Fordítsa le a programot mindkét változatban és probálja ki.
* A nem virtulális változat memória szivárgást jelez.
*
* UNIX/LINUX környezetben a fordítást, és futtatást make segíti:
* Fordítás: make
* Két program készül: virtDestr és nemVirtDestr
* Futtatás: make run
*/
#ifndef MEMTRACE
# define MEMTRACE // ha nem definiált akkor definiáljuk
#endif // MEMTRACE
#include "memtrace.h" #include "memtrace.h"
#define virtual /// A VIRTUAL makró vagy üres, vagy virtual kulcsszót tartalmaz
#ifndef VIRTUAL // ha nem definiált akkor üres lesz
# define VIRTUAL
#endif // VIRTUAL
struct A { struct A {
virtual ~A() {}; VIRTUAL ~A() {};
}; };
/// Amennyiben az alaposztály destruktora nem virtuális,
/// akkor nem fog meghívódni a származtatott osztály destruktora.
class B :public A { class B :public A {
char *p; char *p;
public: public:
...@@ -15,6 +35,8 @@ public: ...@@ -15,6 +35,8 @@ public:
int main() { int main() {
A *pa = new B; A *pa = new B;
delete pa; delete pa; /// B példányát alaposztály típusú pointeren keresztül érjük el.
/// Ezért csak az alaposztály destruktora hívódik, ha az nem
/// virtuális.
return 0; return 0;
} }
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