:"元の"ポインタでdeleteを呼び出す必要があるのはなぜですか?
#include <list>
#include <stdio.h>
struct abc {
long a;
abc() {
puts("const");
}
~abc() {
puts("desc");
}
};
int main() {
std::list<abc*> test;
abc* pA = new abc;
printf("pA: 0x%lX\n", (unsigned long int)pA);
test.push_back(pA);
abc* pB = test.back();
printf("pB: 0x%lX\n", (unsigned long int)pB);
delete pB; // just ~abc()
test.pop_back();
delete pA; // ~abc() and free (works)
puts("before double-free");
delete pA; // ~abc() and second free (crash)
return 0;
}
出力は次のとおりです。
const
pA: 0x93D8008
pB: 0x93D8008
desc
desc
before double-free
desc
*** glibc detected *** ./test: double free or corruption (fasttop): 0x093d8008 ***
...
は私もfree()
が、同じ行動でそれを試してみました。
同じオブジェクトを3回削除していますか? 'new'ごとに、** one ** deleteを持つべきです。 – ronag
"なぜ次のコードで最初の削除はメモリを解放しません" - そうです。 – Mat
メモリはちょうどいいから解放されます。*最初の時間。 – Jon