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

Do I need to use the new operator in C++

本文关键字:运算符 C++ 是否      更新时间:2023-10-16

以下代码块有什么区别:

#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 运算符呢?

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

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

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

在这种情况下,您通常只想使用 auto 存储类定义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是某种标识符),那么很有可能这不是你是否做错了什么的问题,只是有多少事情和多严重错误的问题。

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

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