C ++プログラムをクラッシュさせる最も簡単な方法は何ですか?


318

別のクラッシュしたプロセスとインターフェースするPythonプログラムを作成しようとしています(手に負えない)。残念ながら、私が接続しているプログラムは確実にクラッシュすることすらありません!だから私は意図的にクラッシュする簡単なC ++プログラムを作りたいのですが、実際にはそれを行うための最善かつ最短の方法がわかりません。

int main() {
    crashyCodeGoesHere();
}

C ++プログラムを確実にクラッシュさせる


4
あなたはprivleged命令を実行しようとするアセンブリのインライン使用することができます:asm { cli; };
ネイトKoppenhaver

@aitchnyu各質問に対する回答の使い勝手には違いがあると思います。(参考:私はどちらの質問にも何も投票していません)
Andrew Barber

人がすでに伝播しているときに例外をスローすることについてのコメント?plz chk私の回答をancコメントの下に
Abhinav

4
Redisは次の*((char*)-1) = 'x';コードを使用してクラッシュを誘発し、ここ
Shafik Yaghmour

クラッシュレポートシステムのテストケースを検索しているこの質問を見つけました。通常のランタイム中にクラッシュを強制的に実行して、クラッシュレポーターとスタックダンプの送信を呼び出す必要がありました。ありがとう!
Cory Trese

回答:


264

abort()この関数は、おそらくあなたの最善の策です。これはC標準ライブラリの一部であり、「プログラムの異常終了(致命的なエラーやクラッシュなど)」と定義されています。


14
クラッシュスルーabort()はデストラクタやatexit関数を呼び出さないことに注意してください。ただし、ここでは問題にはなりません。
Xeo

139
@Xeo:デストラクタとatexitsを呼び出した場合、クラッシュは発生しませんか?
ドナルフェロー

abort()正解なので、「exit(-1);」は受け入れられるべきですか?
asir6

9
いいえ、それはクラッシュを引き起こさないので、何かができなかったことを報告するだけです。
ボートコーダー2012

ウィンドウズ。GCC-5.4.0。終了コード:3.エラーメッセージボックスはありません。コンソールメッセージ:「このアプリケーションは、ランタイムを異常終了させるようランタイムに要求しました。詳細については、アプリケーションのサポートチームにお問い合わせください。」
Vadzim 2018

113

試してください:

raise(SIGSEGV);  // simulates a standard crash when access invalid memory
                 // ie anything that can go wrong with pointers.

にあります:

#include <signal.h>

3
これは単なる実装定義ではありませんsignal()。シグナルはでキャッチできます。しかし、ほとんどの正常なアプリケーションはそうではありません。
duskwuff -inactive-

12
アプリケーション内の通常のSIGSEGVとまったく同じ方法でクラッシュします(ほとんどのアプリケーションがクラッシュする方法です)。動作が明確に定義されています(デフォルトでは、アプリケーションを終了してコアファイルを生成します)。はい、ハンドラーを設定できますが、ハンドラーがない場合は、同じ方法でテストしたいと思います。
マーティンヨーク

1
の+1 raise()。これにより、引数を変更するだけで、さまざまな種類の例外をテストできます。

3
お気に入りのソリューションですが、プラットフォームによって異なります。
Nadim Farhat、2014

@NadimFarhat:どのように。シグナルは、すべてのプラットフォーム上のシグナルです。
マーティンヨーク

74

ゼロで除算すると、アプリケーションがクラッシュします。

int main()
{
    return 1 / 0;
}

29
コンパイラの巧妙さに応じて、これはコンパイル時に検出されます。Visual Studio 2008はこれをC ++またはC#用にコンパイルしないことを知っています。
AidanO 2012年

2
コンパイルして実行しましたが、.exeをサンドしますか?
Roee Gavirel

1
2010のようなVisual Studioの最新バージョンのリリース構成では、問題なく実行されます。それは最適化だと思います。
tedyyu 2013

2
iirc腕に衝突しない
シェルピア2015年

2
これは未定義の動作であり、クラッシュすることは保証されていません。多くの場合、コンパイラは未定義の動作に到達できないと想定しています。これはmainret命令を含めて完全に削除される本文につながる可能性があります。実行は次の関数に該当する可能性があります。
usr

64
*((unsigned int*)0) = 0xDEAD;

54
これがクラッシュすることは保証されていません。
Windowsプログラマー、

8
@Windowsprogrammer:いいえ、保証されませ。しかし、アドレス0のメモリにアクセスしようとするアプリケーションを停止しない正常なOS どれですか。
ヨアヒムザウアー

29
「しかし、どの正常なOSがアドレス0のメモリにアクセスしようとするアプリケーションを停止しないのですか?」-それはあなたが本当に聞きたいことではありませんが、とにかく私は答えます。一部のコンピュータでは、アドレス0にRAMがあり、プログラムがそこに値を格納することは完全に意味があります。より意味のある質問は、「C ++実装がnullポインタ用に予約したアドレスでメモリにアクセスするアプリケーションを停止しないOSはどれか」です。その場合、私は何も知りません。ただし、元のプログラムはOSではなくC ++言語に関するものです。
Windowsプログラマー

6
その未定義の動作。これが何もしなくてもまったく問題ありません。クラッシュしないマシン:Z80シリーズのプロセッサーを実行しているもの(私は(私のZ80aは何もしない)と思います)。
Martin York

28
これがクラッシュすることは保証されていませが、C ++で最も一般的な種類のクラッシュの1つです。したがって、クラッシュをシミュレートしたい場合、これは「本格的な」方法です:)
Chris Burt-Brown

53

さて、私たちはスタックオーバーフローをしていますか?

for (long long int i = 0; ++i; (&i)[i] = i);

(標準でクラッシュすることは保証されていませんが、SIGABRTとにかくキャッチされている可能性があるため、承認されたものを含め、提案された回答はどれもありません。実際、これはどこでもクラッシュします。)


4
保護されていないコードページのあるシステムではおかしいので、誤って何もしない無限ループであるコードでプログラムを上書きしていることがわかります。非常に非常に非常に非常にありそうもないが、潜在的に可能です。
マーティンヨーク

@Loki:4000バイトごとに読み取るだけの場合はどうなりますか?クラッシュする可能性は低くなりますか?間違いなく危険度は低くなります。
Mooing Duck

70
そのクラッシュするアルゴリズムはO(1)ではありません!
アントンバルコフスキー

@MooingDuck:面白いコメントを書いているところです。それを真剣に受け取らないでください:-)しかし、誰かが何かおかしいことをする一連の命令を見つけたら興味深いでしょう。
マーティンヨーク

1
@LokiAstari:その通りです。私は(&i)[i] += !i代わりに考えていましたが、コンパイラーが十分に賢いので、それを最適化したいと思っていました。:-)
sam hocevar 2011

35
 throw 42;

ちょうど答え... :)


1
ウィンドウズ。GCC-5.4.0。終了コード:3.エラーメッセージボックスはありません。コンソールメッセージ:「 'int'のインスタンスをスローした後、terminateが呼び出されましたこのアプリケーションはランタイムに異常な方法で終了するよう要求しました。詳細については、アプリケーションのサポートチームにお問い合わせください。」
Vadzim 2018

15

assert(false); かなり良いです。

ISO / IEC 9899:1999によると、NDEBUGが定義されていない場合はクラッシュすることが保証されています。

NDEBUGが定義されている場合[...] assertマクロは次のように定義されます

#define assert(ignore) ((void)0)

アサートマクロは、NDEBUGが含まれるたびに、NDEBUGの現在の状態に従って再定義されます。

[...]

assertマクロは、診断テストをプログラムに入れます。[...]式(スカラー型でなければならない)がfalseの場合[...]。次に、abort関数を呼び出します。


アサーションを使用したデバッグとリリースでVC 2005の動作が異なることを漠然と覚えていますか?
トムカー

8
@Tom assert((void)0)リリースモードと同等になります。
セスカーネギー

2
@SethCarnegieこれで何が悪いのか見てはいけません-定義された定義NDEBUGがクラッシュしない場合のみ?Dansの答えはかなり公平な私見でした。
エイドリアン・コーニッシュ

@AdrianCornish私はトムカーの質問に答えるだけで、この答えが間違っていたとは言わなかった。この回答には反対票を投じませんでした。
セスカーネギー

3
彼がなぜこのテストコードの「リリース」ビルドを行うのか、私にはわかりません。
ジョエルB

11

クラッシュは未定義の動作を呼び出すことの症状であり、未定義の動作を呼び出すとクラッシュを含む何かにつながる可能性があるため、プログラムを実際にクラッシュさせたくはありませんが、デバッガーにドロップするだけです。そうするための最もポータブルな方法は、おそらくabort()です。

一方でraise(SIGABRT)同じ効果があり、それは確かに多くの書き込みにあります。ただし、両方の方法は、のシグナルハンドラをインストールすることで傍受できますSIGABRT。したがって、状況によっては、別のシグナルを発信する必要がある場合があります。SIGFPESIGILLSIGINTSIGTERMまたはSIGSEGV移動するための方法かもしれませんが、それらはすべて傍受することができます。

移植できない場合はSIGBUS、Linuxでの使用のように、選択肢がさらに広がる可能性があります。


1
私は彼がデバッガーを必要としていることを本当に疑っています。彼は、クラッシュするプログラムの呼び出し元がクラッシュを自分の道に送ったときに何が起こるかをテストしたいようです。これは非常に合理的です。
ドナルフェロー

9

私が持っていた唯一のフラッシュはabort()関数です:

これは、プログラムの異常終了によりプロセスを中止します。SIGABRTシグナルを生成します。これにより、デフォルトでプログラムは終了し、ホスト環境に失敗した終了エラーコードを返します。自動または静的ストレージ期間のオブジェクトのデストラクタ実行ずにプログラムは終了します、およびatexit(プログラムが終了する前にexit()によって呼び出される)関数を呼び出さない。呼び出し元に戻ることはありません。


9

答えはプラットフォーム固有であり、目標によって異なります。しかし、これがMozillaのJavascriptクラッシュ機能です。これは、この機能を実現するための多くの課題を示していると思います。

static JS_NEVER_INLINE void
CrashInJS()
{
    /*
     * We write 123 here so that the machine code for this function is
     * unique. Otherwise the linker, trying to be smart, might use the
     * same code for CrashInJS and for some other function. That
     * messes up the signature in minidumps.
     */

#if defined(WIN32)
    /*
     * We used to call DebugBreak() on Windows, but amazingly, it causes
     * the MSVS 2010 debugger not to be able to recover a call stack.
     */
    *((int *) NULL) = 123;
    exit(3);
#elif defined(__APPLE__)
    /*
     * On Mac OS X, Breakpad ignores signals. Only real Mach exceptions are
     * trapped.
     */
    *((int *) NULL) = 123;  /* To continue from here in GDB: "return" then "continue". */
    raise(SIGABRT);  /* In case above statement gets nixed by the optimizer. */
#else
    raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
#endif
}

2
それを完全に削除し、代わりにjQueryを使用する必要があります。
Thomas Weller

1
これは未定義の動作であり、クラッシュすることは保証されていません。多くの場合、コンパイラは未定義の動作に到達できないと想定しています。その場合、少なくともクラッシュする行は削除され、他のコードも削除される可能性があります。
usr

8

ここに投稿された多くの回答が、仕事を成し遂げるためのラッキーケースに該当するようですが、どれもクラッシュすることが100%確定的ではありません。一部は1つのハードウェアとOSでクラッシュしますが、他はクラッシュしません。ただし、それをクラッシュさせるための公式のC ++標準ごとの標準的な方法があります。

C ++標準ISO / IEC 14882§15.1-7からの引用:

例外処理メカニズムが、例外オブジェクトの初期化を完了した後、例外のハンドラーをアクティブ化する前に、例外を介して終了する関数を呼び出すと、std :: terminateが呼び出されます(15.5.1)。

struct C {
    C() { }
    C(const C&) {
        if (std::uncaught_exceptions()) {
            throw 0; // throw during copy to handler’s exception-declaration object (15.3)
        }
    }
};
int main() {
    try {
    throw C(); // calls std::terminate() if construction of the handler’s
    // exception-declaration object is not elided (12.8)
    } catch(C) { }
}

私はこれを実証するために小さなコードを書いており、ここIdeoneで見つけて試してみることができます

class MyClass{
    public:
    ~MyClass() throw(int) { throw 0;}
};

int main() {
  try {
    MyClass myobj; // its destructor will cause an exception

    // This is another exception along with exception due to destructor of myobj and will cause app to terminate
     throw 1;      // It could be some function call which can result in exception.
  }
  catch(...)
  {
    std::cout<<"Exception catched"<<endl;
  }
  return 0;
}

ISO / IEC 14882§15.1/ 9は、tryブロックなしでスローすると、アボートの暗黙的な呼び出しが発生することに言及しています。

現在処理されている例外がない場合、オペランドを指定せずにスロー式を実行すると、std :: terminate()が呼び出されます。

その他には、デストラクタからスロー:ISO / IEC 14882§15.2/ 3


7
*( ( char* ) NULL ) = 0;

これにより、セグメンテーション違反が発生します。


10
これがクラッシュすることは保証されていません。
Windowsプログラマー、

23
「代わりに何が起こりますか?」-代わりに何かが発生する可能性があります。動作は定義されていないため、実装はプログラムの変数の1つに0を割り当てるか、プログラムの変数の1つに42を割り当てるか、ハードドライブをフォーマットしてプログラムの実行を続行できます。
Windowsプログラマー

7
(「Windowsプログラマー」の心の継続)それはあなたにコンピューターを爆発させる可能性があります、またはそれが生きて来て人間性を乗っ取らせるかもしれません。または... 99.9%でクラッシュし、誰も責任を負うことを望まないため、「未定義の動作」として定義されます。
Roee Gavirel、2011

1
実際には、それが未定義の動作を実行することさえ保証されていません-それは完全に定義され、適切に動作する可能性があります。このコードを考えてみましょう:pastebin.com/WXCtTiDDは(あなたには、いくつかの設定変更を行う場合は、rootとしてLinux上でテストされ、あなたはあまりにも非rootユーザーとしてこれを行うことがwiki.debian.org/mmap_min_addr
cha0site

2
@ cha0site:nullポインターを逆参照しているため、標準では未定義の動作であることが保証されています。Linuxで観察したすべての動作は、「未定義の動作」の傘下で許容されます
Ben Voigt 2013年

6

これはありません:

int main = 42;

1
はい、そうです; しかし、それを実行すると、何か素晴らしいことをします。
Joshua

5

デッドループ再帰メソッド呼び出しによるスタックオーバーフローはどうですか?

#include <windows.h>
#include <stdio.h>

void main()
{
    StackOverflow(0);
}

void StackOverflow(int depth)
{
    char blockdata[10000];
    printf("Overflow: %d\n", depth);
    StackOverflow(depth+1);
}

Microsoft KBの元の例を参照してください


4
Sufficiently Smart Compilerが未使用のスタック割り当てと末尾呼び出しの両方を最適化することを妨げる原因は何でしょうか?
JB。

@JB:残念ながら、既存のコンパイラー最適化ロジックに精通していないため、わからない
sll

8
まあ、最適化レベル-O2以上でgcc 4.6.0を使用してここでコンパイルすると、最適化されます。segfaultを実行するには、-O1以下が必要です。
JB。

@Abhinav:C ++で例として表現されたこれらすべての方法で回答を投稿してください:)
sll

5

文字列リテラルが読み取り専用メモリに格納されているため、これは私のLinuxシステムでクラッシュします。

0[""]--;

ちなみに、g ++はこれをコンパイルすることを拒否します。コンパイラはますます賢くなっています:)


4
int i = 1 / 0;

コンパイラはおそらくこれについて警告しますが、GCC 4.4.3では正常にコンパイルされます。これはおそらく SIGFPE(浮動小数点例外)を引き起こします。これは、実際のアプリケーションではSIGSEGV(メモリセグメンテーション違反)ほど可能性が低いです。他の答えが原因ですが、それでもクラッシュです。私の意見では、これはもっと読みやすいです。

別の方法として、チートしてを使用する場合は、次のようになりますsignal.h

#include <signal.h>
int main() {
    raise(SIGKILL);
}

これは、SIGSEGVとは対照的に、サブプロセスを強制終了することが保証されています。


2
これがクラッシュすることは保証されていません。
Windowsプログラマー、

11
C ++言語は、1/0がSIGFPEを引き起こすことを保証しません。動作は未定義です。結果を言うことができるの実装は42です
Windowsのプログラマ

1
動作が定義されていない場合、実装は必要なことを何でも実行できます。C ++言語のいずれ防止や等、どちらの防止、C ++言語のクラッシュダンプを書き込むように実装する必要も42を割り当てるために実装を必要
Windowsのプログラマ

2
@Giorgioハードウェアに自動的にトラップする方法がない場合でも、コンパイラーに少なくとも2つの命令を強制的に出力させます。そのうちの1つも分岐です。これは、部門のコストを約2倍にすることです。誰もがそのようにその費用を支払います。それがオプションでありたい場合は、いつでもライブラリ関数を使用できます。それがオプションではなく、あなたがそれを望まないならば、あなたはまだ費用を払うことになるでしょう。
フレキソ

2
@Giorgio:100,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 * 10 ^ 1000000除算を実行するアプリケーションがあります。コンパイラがこれを知る方法はありませんが、これらのうち0がゼロによる除算になることを知っています。ゼロ除算のチェックをコンパイラーに植え付けたくありません
マーティンヨーク

4

これは、上記の回答で示された、より保証されたアボートバージョンです。これは、sigabrtがブロックされた場合の状況に対応します。プログラムをクラッシュさせるデフォルトのアクションを持つアボートの代わりに、任意の信号を使用できます。

#include<stdio.h>
#include<signal.h>
#include<unistd.h> 
#include<stdlib.h>
int main()
{
    sigset_t act;
    sigemptyset(&act);
    sigfillset(&act);
    sigprocmask(SIG_UNBLOCK,&act,NULL);
    abort();
}

3
int* p=0;
*p=0;

これもクラッシュするはずです。WindowsではAccessViolationでクラッシュし、私が推測するすべてのOSで同じように動作するはずです。


5
on all OS-esいいえ、それは非保護されたOSでクラッシュしない(例えば、MS-DOSが。)実際に、時にはそこにあるアドレス0で何かが!x86のリアルモードでは、割り込みベクタテーブルは、アドレス0である
IKH

Irixではクラッシュしませんでした。私たちは、私たちも達しなかったのLinux(にそのコードを移植したとき、私は悲しげに実現main()
シェフ

3

これは、GoogleがBreakpadで提供するスニペットです。

  volatile int* a = reinterpret_cast<volatile int*>(NULL);
  *a = 1;

1
私はブレイクパッドをテストしているので、これはまさに私が欲しかったものです!Breakpadのミニダンプの中には、コードの中でクラッシュを引き起こしている行を指すスタックトレースを生成しないものがあることがわかりました。これはそうなので、私はそれを良いpocテストとして使うことができます。
BuvinJ 2018


2

この質問にはすでに受け入れられた答えがありますが...

void main(){
    throw 1;
}

または... void main(){throw 1;}


2

システムが読み取り専用メモリブロックをサポートしていない場合を除き、読み取り専用メモリに書き込むと、セグメンテーション違反が発生します。

int main() {
    (int&)main = 0;
}

Windows 7ではMingGW 5.3.0、Linux MintではGCCでテストしました。他のコンパイラやシステムでも同様の効果が得られると思います。


1

または、バンドワゴンを使用しているため、別の方法です。

無限再帰の素敵な作品。スタックを爆破することが保証されています。

int main(int argv, char* argc)
{
   return main(argv, argc)
}

プリントアウト:

セグメンテーション違反(コアダンプ)


13
mainあなたが知らない場合に備えて、自分を呼び出すことは実際には未定義の動作です:)また、末尾再帰がスタックを爆破すること保証されていません。「保証」が必要な場合は、再帰呼び出しの後に何かを行う必要があります。そうしないと、コンパイラーが再帰を最適化して無限ループにする可能性があります。
fredoverflow 2012

0

まだ言及されていないもの:

((void(*)())0)();

これは、nullポインターを関数ポインターとして扱い、それを呼び出します。ほとんどのメソッドと同様に、これはプログラムのクラッシュを保証するものではありませんが、OSがこれをチェックしない状態にして、プログラムが戻る可能性はごくわずかです。


3
OSの起動コードがアドレス0に効果的にマッピングされているため、これが再起動の原因となるマシンがいくつかあります。すべてがPCのように機能するとは限りません。これはクラッシュと言えますが、起動時にすべての状態が消去されるため、デバッグできないためあまり役に立ちません。
マーティンヨーク

@Loki Astari:私はこれがクラッシュであるとは言いませんが、これが原因である場合、デバッグされているプログラムも同様である可能性があります。一方、私はこれらのマシンのどれがPythonを実行できるか知りたいです。
アントンゴロフ

ポイントを逃したと思います。私は0でOSコードを見たことがあります。0で正常に動作する通常の適切なコードを実行するシステムがないことを意味するわけではありません。または、0のバイトが戻りのオペコードと同じくらい簡単になり得ます。
マーティンヨーク

私は0のOSコードを認識しています。これが、0のバイトが戻りのオペコードになることを強く疑う理由の1つです。プログラムは明らかに明らかに実行されておらず、通常の方法で終了しませんでした。つまり、プログラムがクラッシュしました。これが質問者にとって十分でない場合は、彼が自分でコメントすることを期待しています。
Anton Golov

2
ご使用のマシンのOSコードのみを認識しています。私が言おうとしていることは、あなたにとって失敗するかもしれないということです。しかし、それは何も意味しません。世の中にはたくさんのシステムがあります。私はそれらのいくつかがこれでうまくいくかもしれないと確信しています(すなわち、クラッシュしないように)。マシン/ OS固有の動作に依存することは悪い考えであり、長期的にはメンテナンスの問題を引き起こします。このサイトのアイデアは、優れたコードを宣伝することです(そのような作業をコード化するだけではありません)。
マーティンヨーク

0
void main()
{

  int *aNumber = (int*) malloc(sizeof(int));
  int j = 10;
  for(int i = 2; i <= j; ++i)
  {
      aNumber = (int*) realloc(aNumber, sizeof(int) * i);
      j += 10;
  }

}

これがクラッシュすることを願っています。乾杯。


0
int main()
{
    int *p=3;
    int s;
    while(1) {
        s=*p;
        p++;
    }
}

2
いくつかの明確化があれば素晴らしいでしょう:)
olyv '17

1
プロセスが別のプロセスのメモリにアクセスできないため、pポインタはプログラムのアドレス空間を超えてメモリエラーになります。これにより、プログラムがクラッシュします。ポインターpは、そのアドレス空間のランダムな場所を指しています。インクリメントされ、ある時点で無限に逆参照されると、別のプログラムの(プロセス)アドレス空間を指します。しばらくするとクラッシュします。
sc_cs

または、仮にそれは整数のオーバーフローを達成し、無限に実行し、ラップアラウンドする可能性があります。long longまたはを使用して、クラッシュをより速くするために、それぞれの最大値またはそれに近い値size_tから始めようと思いpます。ただし、その場合でもクラッシュする保証はありません。
Patrick Roberts

0

これを行うスタイリッシュな方法は、純粋な仮想関数呼び出しです。

class Base;

void func(Base*);

class Base
{
public:
   virtual void f() = 0;
   Base() 
   {
       func(this);
   }
};

class Derived : Base
{
   virtual void f()
   {
   }
};

void func(Base* p)
{
   p->f();
}


int main()
{
    Derived  d;
}

gccでコンパイルすると、次のように表示されます。

呼び出された純粋な仮想メソッド

アクティブな例外なしで呼び出された終了

中止(コアダンプ)


0

あなたは、C ++でアセンブリを使用することができますcode しかし INT 3、他のシステムは、他のトラップ/ブレークポイント命令を有することができる唯一のx86システム用です。

int main()
{
    __asm int 3;

    return 0;
}

INT 3 割り込みを発生させ、OSが設定した割り込みベクトルを呼び出します。


0

GCCまたはclangでは__builtin_trap()を、MSVCでは__debugbreak()を使用します。これらのブレークポイント/トラップを処理しないと、未処理のブレークポイント例外/クラッシュが発生します。abort()またはexit()を使用する他の提案:これらは他のスレッドによって処理される可能性があるため、クラッシュを伝播したスレッドのスタックを確認することがより困難になります。


-2
char*freeThis;
free(freeThis);

初期化されていないポインタの解放は、未定義の動作です。多くのプラットフォーム/コンパイラでfreeThisは、ランダムな値になります(以前にそのメモリ位置にあったものは何でも)。それを解放すると、そのアドレスでメモリを解放するようシステムに要求します。これは通常、セグメンテーション違反を引き起こし、プログラムをクラッシュさせます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.