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;
}

在这两种情况下,指针都分配了一些内存,对吗?

那我为什么要使用 new 运算符?

4

4 回答 4

6

不,int *pfloat *p声明指针,但它们没有被初始化,所以它们每个都指向内存中的一个随机地址。特别是,它们不指向分配给您的程序的内存空间。

第二段代码正确分配内存并将该内存的地址存储在两个指针中。但是,请注意,您的代码永远不会取消分配内存,因此存在内存泄漏。您必须在程序结束时使用delete pand来避免这种情况。delete q

于 2012-11-06T03:14:47.007 回答
2

更直接地回答标题中的问题:不,您不必new在 C++ 中经常使用运算符;事实上,在编写良好的代码中,您通常很少使用它。

在这种情况下,您通常不想使用指针,而是只定义intfloat使用自动存储类,而不定义任何指针或new根本不使用。当您使用它时,大多数代码也不应该包含using 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只是打印出p&的内存地址q,而不是pq指向的值。

于 2012-11-06T03:20:24.740 回答