0

以下のプログラムでvoidポインタを削除しても大丈夫ですか。

class Sample
{
    public:
        int intVal;
        float floatVal;
};

main() {
    Sample *samObj = new Sample();
    void *vPtr = samObj;
    delete vPtr;
}

これは私が書いたサンプルプログラムです。実際、私のプロジェクトでは、同じようなことをする以外に方法はありません。この同様のコードは.hインターフェイスファイルにあり、このファイルをインクルードして他のコンポーネントをコンパイルすると、コンパイラは「警告:'void *'の削除は未定義です」という警告メッセージを表示しますが、ボイドを割り当てたので疑問です。サンプルオブジェクトタイプのポインタですが、このポインタを削除しても安全ではありませんか?

4

3 に答える 3

1

voidポインタでdeleteを呼び出すことは、未定義の動作です[参照]。あなたはそれを全くすべきではありません。deletevoidポインターではなく、問題のない型のポインターを呼び出していますSample

[参照] C++標準:セクション5.3.5 / 3:

最初の選択肢(オブジェクトの削除)では、オペランドの静的型が動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタを持っているか、動作が定義されていません。 。2番目の選択肢(配列の削除)では、削除するオブジェクトの動的タイプが静的タイプと異なる場合、動作は未定義です。

脚注:

これは、void型のオブジェクトがないため、void*型のポインタを使用してオブジェクトを削除できないことを意味します。

于 2013-03-26T04:48:58.100 に答える
0

いいえ、その方法でvoidポインタを削除することは安全ではありません。コンパイラは、vPtrが何を指しているのかをどのように「知る」ことになっていますか?コンパイラはできません。実行時間は可能ですが、そうではありません。

なぜコンパイラはvPtrが何を指しているのかを「知る」必要があるのでしょうか。デストラクタを呼び出し、割り当てを解除するメモリの量を知る。コンパイラが各割り当てで標準ヘッダーを保持している場合、割り当てを解除するメモリの量はそれほど大きな問題ではない可能性があります。しかし、それはコンパイラに残された詳細だと思うので、この部門でも結果は「未定義」になります。

于 2013-03-26T04:50:21.893 に答える
0

コードは正常に表示されます。void *vPtrnullまたは存在するものを指すことを覚えている限り。

実際の問題は、削除するときに発生しますvoid *vPtr。コンパイラは、削除するオブジェクトを認識しないため、解放できるメモリの数がわかりません。

于 2013-03-26T05:21:53.060 に答える