0

几个问题:

我在 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. 我必须在退出主程序之前删除 A 吗?
  2. 在什么情况下我会使用A *a = new A()与使用A a = A()
4

4 回答 4

2

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

1.2 我想你的意思是一个class,而不是一个对象(一个对象是一个类或一个结构的实例)......仍然没有区别,class只是struct它们的默认访问说明符不同(publicfor structs,privatefor classes) .

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

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

例子:

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

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

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

于 2013-06-03T01:00:17.590 回答
2

对于第一部分:

  1. 它可能很草率(Valgrind 之类的工具会发出警告),但操作系统会在main返回时释放所有内存。如果在程序继续运行时内存泄漏仍然存在,则更令人担忧。
  2. 在 C++ 中,“类”和“结构”之间没有区别。Aclass只是将其初始访问权限修改为私有而不是公共。

对于后面的部分:

  1. 同 1。
  2. 这是一个相当复杂的问题。从广义上讲,如果new对象需要超过当前范围(例如,由构造它的函数返回)或其大小是动态确定的,或者可以非常大,除其他原因外。
于 2013-06-03T01:00:23.653 回答
1

这段代码会导致[小] 内存泄漏,因为他最后从不删除 root 吗?

是的,但是程序被终止,内存应该由操作系统回收。所以任何内存泄漏检查都会标记这一点。

另外,如果“节点”是一个对象而不是一个结构,这会有什么不同吗?

不。结构和类几乎相同,除了结构的默认保护是public

我必须在退出主程序之前删除 A 吗?

是的。为了避免内存泄漏。

在什么情况下我会使用 A *a = new A() 而不是使用 A a = A() ?

使用operator new将在堆上分配内存。最好在堆栈上分配,除非您需要您的对象超过堆栈帧的生命周期,在这种情况下,您可以通过复制返回,或者在堆上分配它,它将一直保留到它被删除。

于 2013-06-03T01:02:52.523 回答
0

第一部分

1) 是的,存在内存泄漏。

2)类和结构之间没有功能差异。

第二部分

1)是的,您应该删除在堆上分配的任何对象。

2)在任何情况下,你可以避免指针(和分配堆内存,就此而言),你应该。使用堆栈需要更少的时间和更少的资源。在这种情况下,对象的生命周期很短,以至于使用堆毫无意义。

于 2013-06-03T00:57:12.437 回答