warning: ‘void operator delete(void*, unsigned int)’ called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]

warning: 'void operator delete(void*, unsigned int)' called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete] gcc/g++
warning: 'void operator delete(void*, unsigned int)' called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]

概要

新しいPCで環境を作りいつものプロジェクトをビルドしなおすと、g++でワーニング warning: 'void operator delete(void*, unsigned int)' called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete] が出た。該当行は次のようなものだった。

delete p;

pは次のコードで生成されていた。

char *p = new char[10];

new演算子で割り当てたオブジェクトの配列はdelete[]でなければならない。次のように修正したところワーニングが出なくなった。

delete[] p;

delete

ググると次のサイトにわかりやすいサンプルが書いてあったのでお借りした。→90629 – Support for -Wmismatched-new-delete

void f() {
 char *p = new char[10];
 delete p;

 char *p2 = new char;
 delete[] p2;

 char *q = new char[10];
 free(q);

 char *q2 = (char *)malloc(10);
 delete[] q2;
}

Wallのオプションをつけて次のようにコンパイルすると、ワーニングが出た。

g++ -Wall test.cpp

ワーニングをソースコードにコメントとして記入すると次のとおり。

void f() {
 char *p = new char[10];
 delete p; // warning: ‘void operator delete(void*, long unsigned int)’ called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]

 char *p2 = new char;
 delete[] p2; // warning: ‘void operator delete [](void*)’ called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]

 char *q = new char[10];
 free(q); // warning: ‘void free(void*)’ called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]

 char *q2 = (char *)malloc(10);
 delete[] q2; // warning: ‘void operator delete [](void*)’ called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]
}

deleteを誤ると動作は未定義なので、これはエラーにしてもいいのではないかと思う。

まとめ

新しい環境でg++のバージョンがg++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0からg++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0に変わることによって今まで出ていなかったワーニングが出るようになったようだ。-Wall-Wmismatched-new-deleteが含まれていなかったのだろうか。危ないところであった。なぜC++でこのの書き方をしているのかはいろいろな事情があるので割愛する。

コメント

タイトルとURLをコピーしました