delete gibt Speicher nicht frei
-
(D)Evil schrieb:
Hmm delete NULL ist nach std. definiert.
"delete objekt" schreib doch aber nicht NULL ins objekt, oder?
-
Also... es kann sein, dass ich mich furchtbarr irre, aber soweit ich weiß, löscht man arrays auf dem heap doch durch delete[]^^
Aber irgendwie sieht das ganze etwas komisch aus, kann schon sein, dass da alles stimmt^^
Und zu top, ich empfehle dir valgrind

Das ist für sowas gemacht^^
-
Führ das ganze doch mal mit strace aus. Meine Vermutung ist, dass du einige brk() sehen wirst. Der Speicher wird so nur intern freigegeben, weil per brk() allozierter Speicher nicht zurückgegeben werden kann. Wenn du stattdessen mmap() siehst, ist tatsächlich etwas falsch.
-
The-Kenny schrieb:
Also... es kann sein, dass ich mich furchtbarr irre, aber soweit ich weiß, löscht man arrays auf dem heap doch durch delete[]^^
Furchtbar, wie du dich irrst
Denn nur mit new alloziierten Speicher gibst du mit delete frei. Das Array wurde aber nicht mit new erstellt.The-Kenny schrieb:
Und zu top, ich empfehle dir valgrind

Danke, werd ich mir anschauen.
-
Du könntest auch einfach in den Destruktor ein
std::cerr << "Destructor!\n";einfügen.
Aber der Code sieht schon richtig aus so.
-
Mr. N schrieb:
Führ das ganze doch mal mit strace aus. Meine Vermutung ist, dass du einige brk() sehen wirst. Der Speicher wird so nur intern freigegeben, weil per brk() allozierter Speicher nicht zurückgegeben werden kann. Wenn du stattdessen mmap() siehst, ist tatsächlich etwas falsch.
strace spuckt mmap2- und brk-Zeilen aus. Wenn du willst, schick ich dir den Output. Was hat das zu bedeuten?
-
Saraneus schrieb:
Mr. N schrieb:
Führ das ganze doch mal mit strace aus. Meine Vermutung ist, dass du einige brk() sehen wirst. Der Speicher wird so nur intern freigegeben, weil per brk() allozierter Speicher nicht zurückgegeben werden kann. Wenn du stattdessen mmap() siehst, ist tatsächlich etwas falsch.
strace spuckt mmap2- und brk-Zeilen aus. Wenn du willst, schick ich dir den Output. Was hat das zu bedeuten?
Ja, zeig her

-
Mr. N schrieb:
Ja, zeig her

Wie du meinst

project@linux-server:~/cpp/ChatServer/src$ strace build/chatserver execve("build/chatserver", ["build/chatserver"], [/* 15 vars */]) = 0 brk(0) = 0x804b000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9c000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=39808, ...}) = 0 mmap2(NULL, 39808, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f92000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0\31\4"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=929648, ...}) = 0 mmap2(NULL, 956068, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7ea8000 mmap2(0xb7f87000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xde) = 0xb7f87000 mmap2(0xb7f8c000, 22180, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f8c000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/i686/cmov/libm.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P4\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=153424, ...}) = 0 mmap2(NULL, 155776, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e81000 mmap2(0xb7ea6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24) = 0xb7ea6000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/libgcc_s.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\34\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=42796, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e80000 mmap2(NULL, 45892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e74000 mmap2(0xb7e7f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa) = 0xb7e7f000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0`\1\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=1307104, ...}) = 0 mmap2(NULL, 1312164, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7d33000 mmap2(0xb7e6e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13b) = 0xb7e6e000 mmap2(0xb7e71000, 9636, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e71000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d32000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7d326d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xb7e6e000, 4096, PROT_READ) = 0 mprotect(0xb7f87000, 12288, PROT_READ) = 0 munmap(0xb7f92000, 39808) = 0 brk(0) = 0x804b000 brk(0x806c000) = 0x806c000 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9b000 write(1, "ChatServer v0.1\n", 16ChatServer v0.1 ) = 16 brk(0x808d000) = 0x808d000 brk(0x80ae000) = 0x80ae000 brk(0x80cf000) = 0x80cf000 brk(0x80f0000) = 0x80f0000 brk(0x8111000) = 0x8111000 brk(0x8132000) = 0x8132000 brk(0x8153000) = 0x8153000 usw. brk(0x96fb000) = 0x96fb000 brk(0x971c000) = 0x971c000 brk(0x973d000) = 0x973d000 write(1, "\n", 1 ) = 1 fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9a000 write(1, "finished", 8finished) = 8 read(0, a "a\n", 1024) = 2 exit_group(0) = ? Process 5651 detached
-
Saraneus schrieb:
project@linux-server:~/cpp/ChatServer/src$ strace build/chatserver
execve("build/chatserver", ["build/chatserver"], [/* 15 vars */]) = 0
brk(0) = 0x804b000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9c000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=39808, ...}) = 0
mmap2(NULL, 39808, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f92000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0\31\4"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=929648, ...}) = 0
mmap2(NULL, 956068, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7ea8000
mmap2(0xb7f87000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xde) = 0xb7f87000
mmap2(0xb7f8c000, 22180, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f8c000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libm.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P4\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=153424, ...}) = 0
mmap2(NULL, 155776, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e81000
mmap2(0xb7ea6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24) = 0xb7ea6000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\34\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=42796, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e80000
mmap2(NULL, 45892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e74000
mmap2(0xb7e7f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa) = 0xb7e7f000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0`\1\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1307104, ...}) = 0
mmap2(NULL, 1312164, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7d33000
mmap2(0xb7e6e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13b) = 0xb7e6e000
mmap2(0xb7e71000, 9636, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e71000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d32000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7d326d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7e6e000, 4096, PROT_READ) = 0
mprotect(0xb7f87000, 12288, PROT_READ) = 0
munmap(0xb7f92000, 39808) = 0Etwa bis hier hin lädt er Shared Objects. Und so Zeug.
Saraneus schrieb:
brk(0) = 0x804b000
brk(0x806c000) = 0x806c000
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9b000Frag mich nicht.
Saraneus schrieb:
write(1, "ChatServer v0.1\n", 16ChatServer v0.1
) = 16
brk(0x808d000) = 0x808d000
brk(0x80ae000) = 0x80ae000
brk(0x80cf000) = 0x80cf000
brk(0x80f0000) = 0x80f0000
brk(0x8111000) = 0x8111000
brk(0x8132000) = 0x8132000
brk(0x8153000) = 0x8153000
usw.
brk(0x96fb000) = 0x96fb000
brk(0x971c000) = 0x971c000
brk(0x973d000) = 0x973d000Hier macht dein toller Chatserver die ganzen news.
Saraneus schrieb:
write(1, "\n", 1
) = 1
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9a000
write(1, "finished", 8finished) = 8
read(0, a
"a\n", 1024) = 2
exit_group(0) = ?
Process 5651 detachedunbrk() gibts halt nicht.
-
Folgende Version funktioniert aber, d.h. "top" spuckt beim Speicherverbrauch immer 0.1% aus.
IrgendeineKlasse *instanz; while(1) { instanz = new IrgendeineKlasse(0); delete instanz; }
-
Saraneus schrieb:
Folgende Version funktioniert aber, d.h. "top" spuckt beim Speicherverbrauch immer 0.1% aus.
IrgendeineKlasse *instanz; while(1) { instanz = new IrgendeineKlasse(0); delete instanz; }Weil er ja das gelöschte wiederverwenden kann. Es wird freigegeben, allerdings nur innerhalb des Programms.