malloc
複数のシステムで動作するライブラリを作成しています (そのうちのいくつかは stdlibを持っていません)。私の stdlib (別のライブラリ) では、new
anddelete
演算子をオーバーライドして関数の汎用呼び出しを行っています (この例にはこれらの関数がありません)。各システムは、それぞれのメモリ割り当てデバイスへのこれらの一般的な呼び出しをオーバーライドします。
問題は、私がこれをやろうとするときです。問題を再現するためのコード例を以下にいくつか示します。
#include <cstdlib>
void* operator new(unsigned long size) {
return std::malloc(size); // would normally call an intermediate function which would be overridden by the system
}
void operator delete(void* object) {
std::free(object); // would normally call an intermediate function which would be overridden by the system
}
void operator delete(void* object, unsigned long size) {
std::free(object); // would normally call an intermediate function which would be overridden by the system
}
class MyClass {
};
int main() {
MyClass* myClass = new MyClass();
delete myClass;
}
プレーンgcc-6
(引数なし) でビルドして (引数なし) で実行するとvalgrind
、次のエラーが発生します。
==11219== Mismatched free() / delete / delete []
==11219== at 0x4C2DD6B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11219== by 0x108730: operator delete(void*, unsigned long) (in /home/chris13524/tmp/test.o)
==11219== by 0x10875A: main (in /home/chris13524/tmp/test.o)
==11219== Address 0x5200040 is 0 bytes inside a block of size 1 alloc'd
==11219== at 0x4C2D1AF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11219== by 0x108745: main (in /home/chris13524/tmp/test.o)
オペレーターは正しく動作しているように見えますdelete
が、Valgrind がオーバーライドされたnew
オペレーターをオーバーライドしています。これを修正する方法はありますか?
そこに他のコードがあるため、中間関数を削除することはオプションではありません。
私の実際のプログラムでどのように動作するかの例 (繰り返しますが、私の例には示されていません):
new => create => <intermediate code> => createImpl => malloc
create => <intermediate code> => createImpl => malloc
gcc v6.2.0、valgrind v3.12.0、および Ubuntu 16.10 を使用しています。