개체의 크기와 배열입니다. 임시 개체를 만들었지 만 삭제하지 않으면 Valgrind는 메모리 누수와 오류를 표시합니다. 그것을 삭제하면 segfault가 발생합니다. 그냥 Valgrind의이 임시 개체를 삭제할 수 없습니다.
void Obj::resize()
{
Obj *temp = new Obj[size * 2]; //<-- line 92
for (int i = 0; i < size; i++)
temp[i] = objarray[i];
delete [] objarray;
objarray = temp;
size *= 2;
//delete temp; //<-- causes segfault
//delete [] temp; // also segfaults, tried them both just in case :\
}
가 여기에 Valgrind의 보고서입니다 ...에 대해 불평 궁금 : 나는 GDB 너무 좋은 아니에요
==9292== HEAP SUMMARY:
==9292== in use at exit: 21,484 bytes in 799 blocks
==9292== total heap usage: 3,528 allocs, 2,729 frees, 91,789 bytes allocated
==9292==
==9292== 21,484 (2,644 direct, 18,840 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 4
==9292== at 0x4008409: operator new[](unsigned int) (vg_replace_malloc.c:357)
==9292== by 0x804AC7E: MyClass::resize() (file.cpp:92)
==9292== by 0x804AC34: MyClass::add(int, int) (file.cpp:82)
==9292== by 0x804AAE6: getline(std::istream&, MyClass&) (file.cpp:66)
==9292== by 0x8049772: main (otherfile.cpp:39)
==9292==
==9292== LEAK SUMMARY:
==9292== definitely lost: 2,644 bytes in 1 blocks
==9292== indirectly lost: 18,840 bytes in 798 blocks
==9292== possibly lost: 0 bytes in 0 blocks
==9292== still reachable: 0 bytes in 0 blocks
==9292== suppressed: 0 bytes in 0 blocks
==9292==
==9292== For counts of detected and suppressed errors, rerun with: -v
==9292== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
만 가지고이 역 추적 :
(gdb) run
Starting program:
Program received signal SIGSEGV, Segmentation fault.
0x46ed40e3 in free() from /lib/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.i686 libgcc-4.7.2-2.fc17.i686 libstdc++-4.7.2-2.fc17.i686
(gdb) backtrace
#0 0x46ed40e3 in free() from /lib/libc.so.6
#1 0x4742dba0 in operator delete(void*)() from /lib/libstdc++.so.6
#2 0x0804ad68 in MyClass::resize (this=0xbffff28c) at file.cpp:98
#3 0x0804ac35 in MyClass::add (this=0xbffff28c, month=10, day=31)
at file.cpp:82
#4 0x0804aae7 in getline (input=..., a=...) at file.cpp:66
#5 0x08049773 in main (argc=1, argv=0xbffff344) at otherfile.cpp:39
(gdb)
포인터를 매달아 놓아야하기 때문에 이것을 삭제하는 것이 좋지 않다고 생각합니다. 그래서 제가 segfault를 얻는 것을 놀라게하지는 않습니다. 그럼에도 불구하고 왜 메모리 문제가 발생합니까? 어떤 아이디어라도 대단히 감사하겠습니다.
왜 '임시'를 삭제 하시겠습니까? ** 당신은 **해서는 안됩니다. delete는 포인터를 해제하지 않지만 가리키는 포인터를 해제합니다. 'temp'를 지우면'objarray'도 삭제합니다. – stardust
예, 알고 있습니다. 내가 왜 궁금해 하건데 아직도 메모리 문제를 일으키는 이유가 무엇입니까? – mcallinder
segfault가 다른 원인에 의해 발생할 수 있습니다. 거기에 효과가 나타납니다. 하지만 원인은 추가 될 수 있습니다 ... – stardust