4
#define BOOST_TEST_MODULE MemoryLeakTest
#include <boost/test/unit_test.hpp>

#include <iostream>
using namespace std;

BOOST_AUTO_TEST_CASE( MemoryLeakTest)
{
    double* n1 = new double(100);
    void* v1 = n1;
    cout << sizeof(v1) << endl;
    delete v1;
}

このコードは、エラーリークなしで完全に正常に機能します。しかし、私はオブジェクトが保持しているサイズを取得できるようにしたいと思いますvoid*。deleteステートメントはオブジェクトv1が指しているオブジェクトの大きさを知っていたので、オブジェクトを削除して保存する必要があるため、方法があると思います。どこか。

4

3 に答える 3

5

C++でポインタに適用するdeleteことは違法です。void *

コンパイラがこれを非標準の拡張機能としてサポートしている場合、deleteそのポインタが指す未知のオブジェクトに些細なデストラクタがあると想定している可能性があります。その場合delete、制御をraw-memoryの割り当て解除関数にすぐに渡す以外に何もする必要はありません。::operator deleteこれはおそらく。を呼び出すだけfreeです。(もちろん、この最後のビットは実装に依存する可能性があります)。

したがって、あなたの質問は基本的に「malloc-edメモリブロックのサイズを決定する方法」に要約されます。それを行うことができる標準機能はありません。サイズを割り当てるときは、自分でサイズを覚えてください。または、プラットフォームによってそのような機能が提供されている場合は、非標準の実装固有のライブラリ機能を使用します。

一部の実装では、これは関数を介して実行できますmsize。しかし、繰り返しになりますが、それを有意義に行うには、最初に実装を調査する必要があります。これは標準のC++ではないため、メモリがどのように割り当てられるか、newおよび/または正確に何が行われるかを理解する必要があります。delete v1

于 2012-07-22T06:00:57.497 に答える
0

のサイズvoid *は引き続きsizeofポインタになります。void *が指しているオブジェクトの実際のサイズを知りたい場合は、実際のオブジェクトを知り、正しい型へのポインターを型キャストする必要があります。いいえ、deleteはオブジェクトポインタのサイズを認識せず、リークが発生します。たとえそうであっても、正しいことはdelete、ポインタを正しい型に型キャストすることを確認することです。

于 2012-07-22T05:36:11.530 に答える
0

からのキャストdouble *void *実行すると、コンパイラが作業するための情報が破棄されます。

したがって、コンパイラは、呼び出すデストラクトやオブジェクトのサイズを認識していません。

于 2012-07-22T06:12:39.653 に答える