0

C スタイルの構造体から C++ スタイルの構造体に型を変換しています。型にコンストラクターを強制的に必要とするメンバーを追加しているため、 and からmallocandfreeに切り替える必要がnewありdeleteます。を探すことで、(このコードベースの規則により) 型が割り当てられている場所を見つけることができますsizeof(TYPE)

その型のポインタが渡されるすべてのインスタンスを見つける方法はありますfreeか? への引数freevoid*、型が解放されているすべての場所で見つけた保証ではないため、私はそれを認識しています。

たとえば、どこで呼び出されfreeてもコンパイル エラーが発生するようにオーバーロードすることはできますか?free(TYPE*)

4

3 に答える 3

6

どうにかして無料でオーバーロードできますか

あなたは確かにそれを試してみることができます. 例えば:

#include <cstdlib>
#include <iterator>

namespace my {
    class TYPE { };
    template <typename T>
    void free(T *ptr) { std::iterator_traits<T>::attempt_to_free_TYPE; }
}

using std::malloc;
using std::free;
using my::TYPE;

int main() {
    TYPE *ptr = (TYPE *) malloc(sizeof(TYPE));
    free(ptr);
}

ADL のおかげで、その への呼び出しfreeは でありmy::free、コードはコンパイルに失敗します。以外の引数を使用しfree((void*)ptr);た への呼び出しは影響を受けないため、明らかにこれは をキャッチしません。freemy::TYPE*

私が書いたように、freenamespace 内my、またはusing namespace my;. したがって、目的のために新しく発明された名前空間を使用したい場合があります。または、キャッチオールの少ないテンプレートを作成します。私はそれを即興で作成しました。

また、 への完全修飾呼び出しもキャッチしませんstd::free。オーバーロード (または名前空間 std 内のもの) は未定義の動作std::freeですが、必要に応じて、呼び出しサイトを見つけるためだけにそれを回避する可能性があります。このようなもの:

template <typename T>
struct allowed_to_free {
    enum { value };
};
template <>
struct allowed_to_free<TYPE> {};

namespace std {
    template <typename T>
    void free(T *ptr) {
        allowed_to_free<T>::value; 
        free((void*)ptr); 
    };
}
于 2013-01-25T12:47:12.137 に答える
0

直接行うことはできません...ただし、そのような (誤って初期化された) インスタンスが使用されているすべての場所を見つけるためのトリックを引き出すことができます。以前の構造体 (現在はクラス) のすべてのメンバーをプライベートにするだけです。コンパイラは、これらのフィールド/メンバーが使用されるたびにエラーを発生させます。これにより、コードをさらに分析し、malloc/free 呼び出しを一掃するための出発点が得られます。

于 2013-01-25T12:13:06.800 に答える
0

valgrind を使用する: 実行時にチェックを行う場合は、valgrind を使用してこの種のタスクを実行することを検討してください。

Valgrind は、間違ってfree'danew()割り当てられたオブジェクトがある場合に通知します。

OPはLinuxではなくVSにあるため、valgrindに似たツールがあると思います。

もう 1 つのオプションは、coverity や clang-analyze などの静的アナライザーを使用することです。

于 2013-01-25T12:08:13.703 に答える