0

我应该什么时候使用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 << std::endl;
    return 0;
}
4

6 回答 6

1

考虑到最近的 C++11 和即将推出的 C++14 标准,在使用带有垃圾收集的语言(如 Java 或 C#)进行编程时,您应该主要使用 new 运算符。这些语言很自然。但是在现代 C++ 中,您可以(并且通常应该)避免直接分配内存。我们现在有一组很好的智能指针。

于 2013-05-30T08:25:26.703 回答
1

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

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

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

于 2013-05-30T00:12:32.723 回答
0

当您想从堆而不是堆栈分配时,请使用 new。或者提升一个抽象层次。当您需要分配的内存在分配它的函数(更正确的范围)可能(在线程的情况下)退出之后保持分配时,请使用 new 。

于 2013-05-29T22:58:25.953 回答
0

当您希望一个对象在删除之前一直存在时,您应该使用 new。如果你不使用 new ,那么当它超出范围时对象将被销毁。

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

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

于 2013-05-29T22:59:00.923 回答
0

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

int *p1;
int n1 = 5;
p1 = &n1;ou

但是在下一段代码中,您请求动态分配一个 int

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

在这里,您创建了一个动态存储的新整数,因此您还应该删除它,否则您已经创建了第一个内存泄漏。如果您动态分配,则必须注意在使用后将其删除。

delete p2;

当您开始使用 new do delete it 分配内存时,这是最大的区别,否则对象实例的解构器将不会运行,因此不会清除您分配的内存。

于 2013-05-29T23:03:59.797 回答
0
int * p2 = new int;

新的 int 部分告诉程序您想要一些适合保存运算符的新存储,使用该类型来确定需要多少字节。然后它找到内存并返回地址。接下来,将地址分配给 p2,它被声明为指向 int 的类型。现在 p2 是地址, *p2 是存储在那里的值。将此与将变量的地址分配给指针进行比较:

int n1;
int * p1 = &n1;

在这两种情况下(p1 和 p2),您都将 int 的地址分配给指针。在第二种情况下,您还可以通过名称访问 int:p1。在第一种情况下,您唯一的访问是通过指针。请记住,您应该使用 delete 来释放由 new 分配的内存

delete p2;

你需要读一些好书……我认为《C++ Primer plus》对你来说是一本好书

于 2013-05-29T23:17:01.080 回答