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) = 0

    Etwa 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) = 0xb7f9b000

    Frag 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) = 0x973d000

    Hier 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 detached

    unbrk() 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.


Anmelden zum Antworten