0

「main.cpp」の8行目でエラーが発生するべきではありませんか?

  • デストラクタを使用していません。
  • 「const」キーワードと関係があると思います。

main.cpp:

#include "stack.hpp"
int main() {
    node* firstnode = new node(NULL, 5);
    std::cout << firstnode -> getvariable() << std::endl;
    node* secondnode = new node(NULL, 10);
    std::cout << secondnode -> getvariable() << std::endl;
    delete firstnode;
    std::cout << firstnode -> getvariable() << std::endl;
    return 0;
}

stack.hpp:

#ifndef stack_hpp
#define stack_hpp
#include <iostream>
class node {
public:
    node(node* nextnode, int variablevalue);
    void setvariable(const int variablevalue);
    const int getvariable() const;
private:
    node* nextnodelink;
    int variable;
};
#endif

stack.cpp:

#include "stack.hpp"
node::node(node* nextnode, int variablevalue)
: nextnodelink(nextnode), variable(variablevalue) {
}

const int node::getvariable() const {
    return variable;
}
4

3 に答える 3

2

オブジェクトを削除すると、オブジェクトが占有していたメモリが「使用可能」に戻されます。コンピュータが高速で動作するように、「利用可能にする」の設計は、解放されたオブジェクトをリンクリストなどに追加する以外はほとんど機能しないようになっています。たとえば、ナンセンスで埋めて使用できなくなることはありません。C ++のポイントは、高速であるということです。すべてdeleteの塗りつぶしを作成すると、後で使用できないようにするためだけにオブジェクトが無意味になり、速度が低下します。

もちろん、他の割り当てを行うと、オブジェクトの内容が実際に「不良」である可能性があります。これが「未定義」である理由です。規格は何が起こるかを述べておらず、ほとんど何でも起こり得る。コンピュータが発火する可能性は低いですが、C規格自体には、「コンピュータに発火させてはならない」などの文言はありません。

経験則として、コードを安全にしたい場合は、コードを削除した後でポインターをNULLに設定してください。そうすれば、ポインタが使用されているときにプログラムがクラッシュする可能性が高くなります。

例えば:

delete firstnode;
firstnode = NULL;
std::cout << firstnode -> getvariable() << std::endl;

これで、「getvariable」を呼び出すとプログラムがクラッシュするはずです。常にそうすることは100%確実ではありません。たとえば、定数を返す関数がある場合でも、「機能する」可能性があります。

于 2013-01-25T23:09:30.767 に答える
0

未定義の動作が発生します。これは、単一の値を返すだけの理由により、(この場合は)まだ機能しています(おそらく)。

firstnode->getvariable()あなたの場合、CPUに、に格納されている値を取得するように指示するだけですfirstnode + x。ここで、xは、クラスの構造に基づく単なるオフセットです。

これは、その変数(またはポインタ)で何かをしようとしていない限り、すぐに問題やエラーを引き起こすことなく機能する可能性があります。firstnodeたとえば、文字列などとして解釈します。これは、firstnode有効なメモリを指しているためです。これはもう割り当てられていません(つまり、「これを使用しないでください」)。

ただし、コンパイラがデバッグビルド用のオーバーヘッドコード(必ずしもコンパイラである必要はありません)を追加する可能性があります。これを試みると、例外が発生します。

于 2013-01-25T23:04:38.740 に答える
0

エラーを取得するには、生成されたコードは、作成したものと削除したものを追跡し、操作が合法であるかどうかを毎回確認する必要があります。これは無料ではありませんが、時間とスペースの両方でコストがかかります。したがって、それは行われていません。C ++は通常、実行時のオーバーヘッドが発生するチェックの導入を回避します。

したがって、未定義の動作を引き起こさないようにするのはあなたの責任です。

于 2013-01-25T23:04:54.277 に答える