私はアーロンの答えに少し混乱しており、率直に言って、必要な理由と場所を完全には理解していないことを認めていdelete[]
ます。
彼のサンプル コードを使っていくつかの実験を行いました (いくつかのタイプミスを修正した後)。これが私の結果です。タイプミス:~Base
関数本体
Base *b
が 2 回宣言されている必要がありました
struct Base { virtual ~Base(){ }>; };
struct Derived : Base { };
int main(){
Base* b = new Derived;
delete b; // this is good
<strike>Base</strike> b = new Derived[2];
delete[] b; // bad! undefined behavior
}
コンパイルと実行
david@Godel:g++ -o atest atest.cpp
david@Godel: ./atest
david@Godel: # No error message
delete[]
削除された修正済みプログラム
struct Base { virtual ~Base(){}; };
struct Derived : Base { };
int main(){
Base* b = new Derived;
delete b; // this is good
b = new Derived[2];
delete b; // bad! undefined behavior
}
コンパイルと実行
david@Godel:g++ -o atest atest.cpp
david@Godel: ./atest
atest(30746) malloc: *** error for object 0x1099008c8: pointer being freed was n
ot allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
もちろん、delete[] b
最初の例で が実際に機能しているかどうかはわかりません。コンパイラエラーメッセージが表示されないことだけを知っています。