2

次のコードを試しているときに「削除」(C++ でのメモリの解放) が機能しないようです...まあ、参照が「後で解放されるオブジェクトを参照する」には適していないことはわかっています。私はちょうどコードを再生しています..

class A{
public:
    int val;
    A(int val_=0):val(val_){}
};

A* ptrA = new A(10);
A &refA = *ptrA;
printf("%d\n", refA.val);
delete ptrA;
refA.val = 100;
printf("%d\n", refA.val);

出力は次のとおりです。10 100

4

3 に答える 3

8

それ機能し、あなたが行うことはすべてrefA未定義の動作を引き起こします。つまり、標準に関する限り、「機能しているように見える」ことを含め、何かが起こる可能性があります。

実際には、そのメモリはまだ再利用されていないため、現時点では機能しているように見えるかもしれませんが、数回の割り当てを待つと、関連のない他のオブジェクトを上書きしていることがわかります。

「未定義の動作」に入ると、運が良ければクラッシュまたは失敗したアサーションが発生することを忘れないでください。多くの場合、奇妙で再現性のないバグが発生し、気が狂ってしまうことがあります。

まあ、参照が「後で解放されるオブジェクトを参照する」には適していないことはわかっています。私はちょうどコードを再生しています..

解放されるものへの参照を持つことは何も悪いことではありません...重要な点は、参照が範囲外になった後に解放する必要があるということです。たとえば、この場合はまったく問題ありません。

A* ptrA = new A(10);
{
    A &refA = *ptrA;
    std::cout<<refA.val<<"\n";
}
delete ptrA;
于 2012-12-23T17:29:38.927 に答える
2

まあ、参照が「後で解放されるオブジェクトを参照する」には適していないことはわかっています

実はまだよくわかっていないようです。とは言っても、やろうとすればエラーなどが発生するわけではありません。これは、すべての賭けがオフになり、何でも起こり得ることを意味します。「何でも」には、観察した行動が含まれます。

何が起こるかについて何の保証もないので、基本的にギャンブルによるプログラミングに相当します。

于 2012-12-23T17:31:43.577 に答える
1

オブジェクトが削除され、コードによって未定義の動作が発生します。特定のケースでは、必要なものを出力しますが、それは機能せず、一般的なケースでは機能しません。

于 2012-12-23T17:34:19.417 に答える