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 <cstdlib>
#ifndef VIRT // ha nem definiált akkor üres lesz
# define VIRT
#endif // VIRT
/// 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 {
VIRT ~A() {
VIRTUAL ~A() {
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 {
char *p;
public:
B() { p=new char[1000];}
~B() { delete[] p; }
~B() { delete[] p; std::cout << '*'; }
};
int main(int argc, char *argv[]) {
......@@ -25,7 +38,9 @@ int main(int argc, char *argv[]) {
for (int i = 0; i < num; i++) {
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;
return 0;
......
......@@ -7,7 +7,7 @@
<Option compiler="gcc" />
<Build>
<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 type="1" />
<Option compiler="gcc" />
......@@ -16,7 +16,7 @@
</Compiler>
</Target>
<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 type="1" />
<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"
#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 {
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 {
char *p;
public:
......@@ -15,6 +35,8 @@ public:
int main() {
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;
}
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