1

重複の可能性:ローカル変数
または一時変数のアドレスを返す
ローカル変数のメモリにそのスコープ外でアクセスできますか?

次のコードがあるとします

int *p;//global pointer
void foo() {
  int a=10;//created in stack
  p = &a;
}//after this a should be deallocated and p should be now a dangling pointer
int main() {
  foo();
  cout << *p << endl;
}

これが機能する理由を知りたかった..セグメント障害である必要があります!

OK 未定義の動作は適切なようです..もう一度確認できますか? 次のコードで上記のことをシミュレートしようとしましたが、現在は SIGSEGV になります。

int main() {
    int *p=NULL;
    {
        int i=5;
        int *q = &i;
        p=q;
        delete q;//simulates the deallocation if not deallocated by the destructor..so p becomes a dangling pointer
    }
    cout << *p << endl;
}
4

3 に答える 3

3

Undefined Behaviorを持つプログラムを作成しました。UB はセグメント障害を意味するのではなく、何かが起こる可能性があることを意味します。プログラムを実行すると、予期していなかったことが起こりました。この話の教訓は、UB でプログラムを書くなということです。

于 2012-10-20T08:39:40.623 に答える
1

グローバル変数は使用しないでください。あなたの例では、あなたがしたことは未定義の動作です。

あなたが何かをしたなら

int* foo() {
  int a = 10; //created in stack
  return &a;
}

int main() {
  int *p = foo();
  cout << *p << endl;
}

少なくとも次の警告が表示されます。

prog.cpp:5: warning: address of local variable ‘a’ returned

これらの警告は非常に真剣に扱う必要があります。

于 2012-10-20T08:41:40.277 に答える
-1

関数で変数を定義すると、スタックに割り当てられ、その変数の関数デストラクタからの戻り値が自動的に呼び出されます(型にデストラクタがある場合)が、ヒープに割り当てられたオブジェクトとは異なり、スタックのメモリは解放されませんこの点:

void test1() {
    // assume on start of this function top of stack is 0x100
    int a = 10; // push 10 on to of stack and increase top of stack
                // Now top of stack is 0x100 + sizeof(int)
    a = 20;     // when you do this you are actually changing variable on stack
    p = &a;     // Get address of variable in stack!
                // So p is now 0x100
    // hidden return will restore top of stack to 0x100, pop return address, ...
}
int test2() {
    // again top of stack is 0x100
    int a2;     // a2 is in same address as a in previous function!
    a2 = 100;   // so this will overwrite value that pointed by p
                // because it point to same location
    return (int)&a2;
}

void main() {
    test1();
    test2();
    std::cout << *p << std::endl;
}

ただし、型がデストラクタを持ち、使用前に構築が必要なクラスである場合、セグメンテーション違反などの例外を受け取ることさえあります

于 2012-10-20T08:53:32.263 に答える