-1

ステップ 1. クラスのインスタンスを作成する

ステップ 2. このインスタンスをベクターにプッシュする

ステップ 3.delete this;インスタンスのメンバー メソッドを呼び出す

ステップ 4. すべて問題ありません

ステップ 5. ベクトルに何かをプッシュして、これを取得します

*** glibc detected *** ./app: double free or corruption (fasttop): 0x0000000001017930 ***
======= Backtrace: =========
/lib/libc.so.6(+0x71bd6)[0x7f607d60cbd6]
/lib/libc.so.6(cfree+0x6c)[0x7f607d61194c]
./app[0x40231c]
./app[0x402290]
./app[0x4053c0]
./app[0x4048fe]
./app[0x404246]
./app[0x403fe0]
./app[0x402400]
./app[0x4035cb]
./app[0x4034d3]
/lib/libpthread.so.0(+0x68ca)[0x7f607e2b78ca]
/lib/libc.so.6(clone+0x6d)[0x7f607d66a92d]
======= Memory map: ========
00400000-0040f000 r-xp 00000000 09:03 60427370                           /root/AHS/app
0060e000-0060f000 rw-p 0000e000 09:03 60427370                           /root/AHS/app
01017000-01038000 rw-p 00000000 00:00 0                                  [heap]
7f6074000000-7f6074021000 rw-p 00000000 00:00 0
7f6074021000-7f6078000000 ---p 00000000 00:00 0
7f607a595000-7f607a596000 ---p 00000000 00:00 0
7f607a596000-7f607ad96000 rw-p 00000000 00:00 0
7f607ad96000-7f607ad97000 ---p 00000000 00:00 0
7f607ad97000-7f607b597000 rw-p 00000000 00:00 0
7f607b597000-7f607b598000 ---p 00000000 00:00 0
7f607b598000-7f607bd98000 rw-p 00000000 00:00 0
7f607bd98000-7f607bd99000 ---p 00000000 00:00 0
7f607bd99000-7f607c599000 rw-p 00000000 00:00 0
7f607c599000-7f607c59a000 ---p 00000000 00:00 0
7f607c59a000-7f607cd9a000 rw-p 00000000 00:00 0
7f607cd9a000-7f607cd9b000 ---p 00000000 00:00 0
7f607cd9b000-7f607d59b000 rw-p 00000000 00:00 0
7f607d59b000-7f607d6f4000 r-xp 00000000 09:03 60425052                   /lib/libc-2.11.3.so
7f607d6f4000-7f607d8f3000 ---p 00159000 09:03 60425052                   /lib/libc-2.11.3.so
7f607d8f3000-7f607d8f7000 r--p 00158000 09:03 60425052                   /lib/libc-2.11.3.so
7f607d8f7000-7f607d8f8000 rw-p 0015c000 09:03 60425052                   /lib/libc-2.11.3.so
7f607d8f8000-7f607d8fd000 rw-p 00000000 00:00 0
7f607d8fd000-7f607d913000 r-xp 00000000 09:03 60425245                   /lib/libgcc_s.so.1
7f607d913000-7f607db12000 ---p 00016000 09:03 60425245                   /lib/libgcc_s.so.1
7f607db12000-7f607db13000 rw-p 00015000 09:03 60425245                   /lib/libgcc_s.so.1
7f607db13000-7f607db93000 r-xp 00000000 09:03 60425438                   /lib/libm-2.11.3.so
7f607db93000-7f607dd93000 ---p 00080000 09:03 60425438                   /lib/libm-2.11.3.so
7f607dd93000-7f607dd94000 r--p 00080000 09:03 60425438                   /lib/libm-2.11.3.so
7f607dd94000-7f607dd95000 rw-p 00081000 09:03 60425438                   /lib/libm-2.11.3.so
7f607dd95000-7f607de8b000 r-xp 00000000 09:03 60032880                   /usr/lib/libstdc++.so.6.0.13
7f607de8b000-7f607e08b000 ---p 000f6000 09:03 60032880                   /usr/lib/libstdc++.so.6.0.13
7f607e08b000-7f607e092000 r--p 000f6000 09:03 60032880                   /usr/lib/libstdc++.so.6.0.13
7f607e092000-7f607e094000 rw-p 000fd000 09:03 60032880                   /usr/lib/libstdc++.so.6.0.13
7f607e094000-7f607e0a9000 rw-p 00000000 00:00 0
7f607e0a9000-7f607e0b0000 r-xp 00000000 09:03 60425177                   /lib/librt-2.11.3.so
7f607e0b0000-7f607e2af000 ---p 00007000 09:03 60425177                   /lib/librt-2.11.3.so
7f607e2af000-7f607e2b0000 r--p 00006000 09:03 60425177                   /lib/librt-2.11.3.so
7f607e2b0000-7f607e2b1000 rw-p 00007000 09:03 60425177                   /lib/librt-2.11.3.so
7f607e2b1000-7f607e2c8000 r-xp 00000000 09:03 60425205                   /lib/libpthread-2.11.3.so
7f607e2c8000-7f607e4c7000 ---p 00017000 09:03 60425205                   /lib/libpthread-2.11.3.so
7f607e4c7000-7f607e4c8000 r--p 00016000 09:03 60425205                   /lib/libpthread-2.11.3.so
7f607e4c8000-7f607e4c9000 rw-p 00017000 09:03 60425205                   /lib/libpthread-2.11.3.so
7f607e4c9000-7f607e4cd000 rw-p 00000000 00:00 0
7f607e4cd000-7f607e4eb000 r-xp 00000000 09:03 60425293                   /lib/ld-2.11.3.so
7f607e6da000-7f607e6df000 rw-p 00000000 00:00 0
7f607e6e7000-7f607e6ea000 rw-p 00000000 00:00 0
7f607e6ea000-7f607e6eb000 r--p 0001d000 09:03 60425293                   /lib/ld-2.11.3.so
7f607e6eb000-7f607e6ec000 rw-p 0001e000 09:03 60425293                   /lib/ld-2.11.3.so
7f607e6ec000-7f607e6ed000 rw-p 00000000 00:00 0
7fff4ee3b000-7fff4ee50000 rw-p 00000000 00:00 0                          [stack]
7fff4efff000-7fff4f000000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

誰か教えてください、これは何ですか、なぜこれが発生するのか、どうすれば修正できますか?

4

4 に答える 4

4

所有していないメモリを解放したためです。は、そのvector内容を含むメモリを所有しています。

delete this;使い終わったレンタカーを解体場に持っていくようなものです。そうしないでください、レンタル会社はそれを期待しています!

メモリを所有していることと、メモリの制御を単に貸与されていることとの違いに注意してください。

于 2012-08-23T21:19:28.340 に答える
2

あなたdelete thisに属するオブジェクトを処理するvectorことは、2つの大きな間違いを犯しています。

  1. これは、そのインスタンスが格納されているメモリを管理するベクトルです(割り当て、割り当て解除など)。したがって、それを台無しにしないでください。言い換えれば、あなたはその記憶を所有していないので、それを放っておかなければなりません。
  2. deleteオブジェクトが-で割り当てられた場合、は正しい一致ですnewが、によって管理されるオブジェクトはvectorそのように割り当てられません。代わりに、vectorアロケータからメモリのチャンクを取得し(適切と思われる大きさ)、配置を使用してアロケータにプッシュされた要素をそこにコピーしますnew。したがって、所有していないメモリを解放しているだけでなく、間違った方法を使用してメモリを解放しています。

から要素を削除する必要がある場合は、メソッドvectorを使用してください。vector::erase

于 2012-08-23T21:24:08.310 に答える
1

これはあなたが説明しているコードに似ていますか?

struct MyClass {
    void f() { delete this; }
};

int main() {
    MyClass c;
    std::vector<MyClass> v;
    v.push_back(c);
    c.f();
    return 0;
}

ベクトルは無関係です。問題はdelete this、デストラクタを呼び出して、構築されcたメモリを解放することです。cそのメモリはスタック上にあり、解放できません。スタックオブジェクトを削除しないでください。コンパイラーは、スコープ外になったとき(この場合は。の終わり)にそれらをクリーンアップするためのコードを生成しますmain

于 2012-08-23T21:37:57.840 に答える
1

いずれかdelete thisのメソッドで実行する場合は、そのステートメントの後に、他の誰もインスタンスのメソッド(さらに言えばコード)を呼び出さないようにする必要があります。これには。が含まれますdestructor

インスタンスをベクターにプッシュすると、破棄されている間、ベクターはインスタンスのデストラクタを呼び出します。したがって、double free

ベクトルが必要な場合は、インスタンスへのポインターをプッシュできます。これで問題ありません。

ただし、他の人が言っているように、絶対に必要な場合を除いて使用しないでくださいdelete this

関数内にクラスのローカルインスタンスを作成するだけでも問題が発生します。ローカル変数のスコープが終了する前にプログラムが終了したため、この動作は見られなかった可能性があります。これを試した場合:

void func() {
    MyClass myClass;
    myClass.theBadFunc();
}

これが戻ると、コアダンプが作成されます。

于 2012-08-23T21:26:13.740 に答える