我是否需要在C ++中使用new运算符

时间:2012-11-06 03:13:24

标签: c++

以下代码块之间有什么区别:

#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 个答案:

答案 0 :(得分:6)

不,int *pfloat *p声明指针,但它们未初始化,因此它们都指向内存中的随机地址。特别是,它们不指向分配给程序的内存空间。

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

答案 1 :(得分:2)

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

在这种情况下,您通常只想使用自动存储类定义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是某种标识符),那么它的确很不错一个问题你是否做错了什么,只讨论了多少事情以及多么严重的错误。

答案 2 :(得分:0)

在第一个代码块中,为指针本身分配了内存,但没有分配内存,它们可以指向并有效使用。打印出的地址对您的程序来说是不安全的。

答案 3 :(得分:0)

“指针”变量已经在main()堆栈中分配,32位中的4个字节或64位机器中的8个字节。 intfloat的内存存储分别由p和q指向,在第一种情况下尚未分配。您的cout只打印出p&amp;的内存地址。 q,而不是pq指向的值。