c++ - C++中删除对象和new关键字

标签 c++ memory delete-operator

几个问题:

我在 www.cprogramming.com 上查看链表的以下代码:

struct node {
  int x;
  node *next;
};

int main()
{
  node *root;      // This will be the unchanging first node

  root = new node; // Now root points to a node struct
  root->next = 0;  // The node root points to has its next pointer
                   //  set equal to a null pointer
  root->x = 5;     // By using the -> operator, you can modify the node
                   //  a pointer (root in this case) points to.
}
  1. 这段代码会不会导致[小]内存泄漏,因为他从不在最后删除 root?

  2. 此外,如果“节点”是类而不是结构,这会有什么不同吗?

最后,对于这段代码:

#include <iostream>

using namespace std;

class A
{
public:
A(){}
void sing()
{ cout << "TEST\n";}
};

int main()
{
A *a = new A();
a->sing();
return 0;
}
  1. 我必须在退出 main 之前删除 A 吗?
  2. 在什么情况下我会使用 A *a = new A() 还是使用 A a = A()

最佳答案

1.1 是的,尽管在任何现代操作系统上,当进程结束时,它的所有内存都会被操作系统回收。内存泄漏对于长期存在的进程来说是一个大问题,内存继续泄漏并且进程无缘无故地继续请求更多内存。

1.2 我想你的意思是 class,而不是对象(对象是类或结构的实例化)...仍然没有区别,class struct 的区别仅在于它们的默认访问说明符(public 用于 structprivate 用于 es)。

2.1 是(与 1.1 中的警告相同)。

2.2 通常当 (a) A 太大而无法放入堆栈时,(b) 当局部变量强加的对象生命周期(=在作用域结束时自动销毁)是不合适,(c) 当要创建的对象数量在编译时未知时。

例子:

一个。 A 在其定义中包含一个非常大的矩阵,这会占用大量堆栈空间;或者,A并不大,但是当前调用是递归的,所以放到栈中很可能会导致栈溢出。

A 是一个要从此函数返回的对象(不能接受拷贝);或者,A 将在此函数中创建,并在将来由其他函数删除,但不会在当前范围的末尾删除。

A 是链表的节点,由用户提供的数据填充;您在循环中创建并附加节点,直到用户提供的数据结束。

关于c++ - C++中删除对象和new关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16888751/

相关文章:

c++ - 如何将值放入数组的动态数组中并在 C++ 中删除它们

c++ - 逗号作为分隔符和运算符

c++ - 混合数字类运算符重载 C++

C++ const 引用在 ctor 中分​​配的类成员变量

c++ - 当您从 C++ 函数返回引用时会发生什么?

c++ - 删除没有指定大小的指针数组

c++ - Petsc 添加矩阵值

c - 内存到内存传输优化,如何不memcpy?

javascript - 为什么修改全局变量会增加 Chrome 中的内存使用量

c++ - 如果我直接调用operator new而不使用new表达式并将返回指针类型安全地转换?