C++ 何时使用新操作员?

C++ 何时使用新操作员?,c++,pointers,new-operator,C++,Pointers,New Operator,我应该在什么时候使用新操作符? 在我的示例中,我使用两种不同的方法得到相同的结果: #include <iostream> int main() { int *p1; int n1 = 5; p1 = &n1; int *p2; p2 = new int; *p2 = 5; std::cout << *p1 << std::endl; std::cout << *p2 &l

我应该在什么时候使用
新操作符

在我的示例中,我使用两种不同的方法得到相同的结果:

#include <iostream>
int main() {
    int *p1;
    int n1 = 5;
    p1 = &n1;

    int *p2;
    p2 = new int;
    *p2 = 5;

    std::cout << *p1 << std::endl;
    std::cout << *p2 << std::endl;
    return 0;
}
#包括
int main(){
int*p1;
int n1=5;
p1=&n1;
int*p2;
p2=新的整数;
*p2=5;

std::cout当您希望从堆而不是堆栈进行分配时,请使用new。或者当您需要分配的内存在分配给它的函数(更合适的作用域)之后保持分配时,请使用new(线程情况下)已退出。

如果希望对象在删除之前保持存在,则应使用“新建”。如果不使用“新建”,则对象超出范围时将被销毁

有些人会说,new的使用决定了对象是在堆上还是在堆栈上,但这只适用于函数中声明的变量


分配(和释放)使用“new”的对象比就地分配的对象要昂贵得多,因此它的使用应该限制在必要的地方。

在这段代码中,您处理的是内存,但使用的是自动内存。编译器会为您安排存储每个变量的位置。
p1
指向
n1
但大多数工作是自动完成的

int *p1;
int n1 = 5;
p1 = &n1;ou
但是,在下一段代码中,您请求动态分配一个int

int *p2;
p2 = new int;
*p2 = 5;
在这里,您创建了一个动态存储的新整数,因此您也应该删除它,否则您将创建第一个内存泄漏。如果动态分配,您必须注意在使用后删除它

delete p2;
当您开始使用new do delete分配内存时,这是最大的差异,否则对象实例的解结构将不会运行,因此不会清除已分配的内存

int * p2 = new int;
新的int部分告诉程序,您需要一些新的存储空间来容纳 运算符使用该类型计算需要多少字节。 然后它找到内存并返回地址 声明为pointer-to-int类型。现在p2是地址,*p2是存储的值 这里。将其与将变量地址分配给指针进行比较:

int n1;
int * p1 = &n1;
在这两种情况下(p1和p2),您都将int的地址分配给指针 在第一种情况下,您还可以通过名称p1访问int。在第一种情况下,您只能通过指针进行访问。 记住,应该使用delete释放new分配的内存

delete p2;
你需要读一些好书。。。
我认为“C++Primer plus”对您来说是一个不错的选择

使用动态分配内存的目的是以下一个(或多个)

  • 对对象生命周期的运行时控制。例如,根据用户的需要,通过
    new
    手动创建对象,并通过
    delete
    手动销毁对象
  • 运行时对对象类型的控制。例如,您可以在运行时设计多态对象的实际类型
  • 运行时对对象数量的控制。例如,您可以在运行时决定数组大小或列表中的元素数
  • 当对象太大而无法合理地放入任何其他类型的内存时。例如,太大而无法在堆栈上分配的大型输入输出缓冲区

在您的具体示例中,这些原因都不适用,这意味着使用动态内存毫无意义。

考虑到最近的C++11和即将推出的C++14标准,在使用垃圾收集语言(如Java或C#)编程时,您应该主要使用新运算符。这对于这些语言来说是很自然的OdC++可以直接避免内存分配。我们现在有一组漂亮的智能指针。< /P>不要,除非你遇到了一个绝对需要的情况(你会知道)。在现代C++中,很少需要这样做。如果你要问,你可能还不需要它。有些人用它来延长对象的寿命。然而,它们会给那些不朽的对象带来危险,最后把它们变成僵尸,而你会“记住”。从C++14开始,在正常情况下,绝对不会。在C++11中,当初始化
std::unique_ptr
时,您可以不使用它。在C++03中,仍然有很多选择可以避免使用它。@chris这很有趣,您介意提供一些上下文吗?最好链接到,而不是提出您自己的建议我不同意你的第三个子弹。STL容器允许运行时控制数量,而不显式使用<代码>新< /C++ >。
其中
n
是在运行时确定的,只要您只在其声明的范围内访问
x
。@Max:有许多其他数据结构(除了STL容器支持的线性序列)需要为其创建运行时数量的对象。在任何情况下,使用(或不使用)STL容器是编程风格的问题,而不是我试图回答的概念适用性问题。至于 int x[n] < /C> >它不是现代C++ C++的一部分,而是C99,而不是C++。