実際には、フックの下でgcc C++のデフォルトのnew演算子newがmallocを呼び出し、gcc互換のソリューションしか必要でないことを確認したので、C mallocにフックするだけで十分です。
私はその簡単なプログラムでそれを証明することができます:
mem.C++:
#include <iostream>
#include <string>
class A {
int ival;
std::string str;
public:
A(int i, std::string s): ival(i), str(s) {}
A(): ival(0), str("") {};
int getIval() const {
return ival;
}
std::string getStr() const {
return str;
}
};
int main() {
A a(2, "foo");
std::cout << &a << " : " << a.getIval() << " - " << a.getStr() << std::endl;
return 0;
}
memhook.c:
#include <stdio.h>
#include <stdlib.h>
extern void *__libc_malloc(size_t size);
void* malloc (size_t size) {
fprintf(stderr, "Allocating %u\n", size);
return NULL;
// return __libc_malloc(size);
}
NULLを(上記のように)戻って、プログラムを表示:
Allocating 16
Allocating 100
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Abandon (core dumped)
Allocating 16
0xbfe8d2e8 : 2 - foo
使用 'ulimit':そのCで
std::bad_alloc
例外で宣言さmalloc関数結果からNULL戻り++コードreturn __libc_malloc(size);
割り当てはlibcのmalloc関数によって行われ、出力となるコメントを解除証明0最大データセグメントサイズを制限し、ランダムな割り当ての失敗を強制的に強制します。 –私は常にvalgrindでテストしています。ランタイムは問題ですが、それはそれだけの価値があります。 – mousomer
CとC++は異なる言語です。問題はすでに広すぎて、そのうちの1人にはあまりにも強く反論されている。 – Olaf