0

次のコードブロックの違いは何ですか?

#include<iostream>
using namespace std;
int main()
{
    int *p;
    float *q;
    cout<<p<<"\n"<<q;
}

そしてこのコード:

#include<iostream>
using namespace std;
int main()
{
    int *p;
    float *q;
    p = new int;
    q = new float;
    cout<<p<<"\n"<<q;
}

どちらの場合も、ポインタにはメモリが割り当てられていますか?

では、なぜ新しい演算子を使用する必要があるのですか?

4

4 に答える 4

6

いいえ、ポインタint *pfloat *p宣言しますが、初期化されていないため、それぞれがメモリ内のランダムなアドレスを指します。特に、プログラムに割り当てられたメモリスペースを指していません。

2番目のコードは、メモリを正しく割り当て、そのメモリのアドレスを2つのポインタに格納します。ただし、コードによってメモリが割り当て解除されることはないため、メモリリークが発生することに注意してください。これを回避するには、プログラムの最後にを使用する必要がdelete pあります。delete q

于 2012-11-06T03:14:47.007 に答える
2

タイトルの質問にもう少し直接的に答えるには、次のようにします。いいえ、newC++では演算子を頻繁に使用する必要はありません。実際、よく書かれたコードでは、通常、それを使用することはめったにありません。

この場合、ポインタをまったく使用するのではなく、通常、ポインタを定義したり、まったく使用したりせずに、自動ストレージクラスを定義しintて使用するだけです。あなたがそれにいる間、ほとんどのコードはそれに含まれるべきではありません。それらを修正すると、次のような結果になる可能性があります。floatnewusing namespace std;

#include<iostream>

int main()
{
    int p = 1;
    float q = 2.0f;
    std::cout<<p<<"\n"<<q;
}

あなたのコードが持っているnew、そして/またはT *xxx非常に頻繁に(Tあるタイプとある識別子がある場合)、それはあなたが何か間違ったことをしているのかどうかxxxの問題ではなく、どれだけ多くのこととどれほどひどく間違っているのかという問題ではない可能性がかなりあります。

于 2012-11-06T03:28:59.370 に答える
0

コードの最初のブロックでは、ポインタ自体にメモリが割り当てられていますが、ポインタがポイントして有効に使用できるメモリは割り当てられていません。印刷されたアドレスは、プログラムで使用するのに安全ではありません。

于 2012-11-06T03:19:51.330 に答える
0

「ポインタ」変数はすでにmain()スタックに割り当てられており、32ビットでは4バイト、64ビットマシンでは8バイトです。int最初のケースでは、それぞれpとqが指すとのメモリストレージfloatはまだ割り当てられていません。は、またはが指す値ではなく、&coutのメモリアドレスを出力するだけです。pqpq

于 2012-11-06T03:20:24.740 に答える